C# 实体框架在获取数据之前还是之后执行lambda表达式?

C# 实体框架在获取数据之前还是之后执行lambda表达式?,c#,linq,entity-framework,lambda,C#,Linq,Entity Framework,Lambda,我一直认为,如果BigDataSet是一个实体,并且您分配var someThing=Context.BigDataSet.Single(x=>x.Name.Trim().ToUpper.Equals(someName.Trim().ToUpper())然后EF将做一些魔术,将lambda表达式转换为查询,如 从大数据集中选择*,其中name=(someName) 但是仔细考虑之后,我发现除了将Context.BigDataSet的结果保存在内存中,然后执行搜索之外,没有其他方法可以起作用 EF

我一直认为,如果
BigDataSet
是一个实体,并且您分配
var someThing=Context.BigDataSet.Single(x=>x.Name.Trim().ToUpper.Equals(someName.Trim().ToUpper())然后EF将做一些魔术,将lambda表达式转换为查询,如

从大数据集中选择*,其中name=(someName)

但是仔细考虑之后,我发现除了将
Context.BigDataSet
的结果保存在内存中,然后执行搜索之外,没有其他方法可以起作用

EF
DbSet
lambda表达式是转换成SQL,还是在事实发生后全部应用


编辑:如果它们被转换成SQL,那么
EF
如何“看到”在获取名称后将要发生的所有事情?如果我调用
instance.MethodA().MethodB()
,这通常不意味着方法
A
B
是按顺序执行的吗?

除非您对存储过程函数映射执行lambda操作,否则它们会转换为SQL。
您可以使用SQL事件探查器(或EF事件探查器)亲自查看这一点,并查看在运行查询时生成的SQL。

实体框架不会影响数据库,直到您对查询进行迭代,基本上是返回IQueryable,然后在执行查询时将其转换为SQL查询

var query = context.Employees; // Returns IQueryable<Employee>

var employees = context.Employees.ToList(); // Returns List<Employee> (Hits the database)
var query=context.Employees;//返回IQueryable
var employees=context.employees.ToList();//返回列表(点击数据库)

如果你想要一个全面的解释,你可以在谷歌上搜索“实体框架延迟执行”。

当直接在实体上调用时,它们被转换成SQL

如果要在本地缓存结果,以便不在实体的每个查询上都命中数据库,则可以使用立即执行,例如通过
ToList()
,然后对这些缓存的值运行多个查询。显然,这会直接命中数据库,但只命中一次

一般来说,与LINQ查询一样,在开始迭代生成的IEnumerable之前,工作不会发生(即,不会命中数据库)

通过查看查询生成的SQL,您可以更好地理解问题的第二部分,例如尝试:

var query = Context.BigDataSet.Single(x => x.Name.Trim().ToUpper.Equals(someName.Trim().ToUpper()));
var objectQuery=query as System.Data.Objects.ObjectQuery;
Console.WriteLine(objectQuery.ToTraceString());
获取表达式树而不是lambdas。 在仔细考虑了你的问题之后,我猜你没有意识到你使用的表达方式。
表达式谓词
和just
Func谓词
之间的区别。这很重要。提供程序将无法使用func。它需要一个表达式树

LINQ有一个子集,可以在基于LINQ到实体标准的表达式中使用

在调试器中尝试并查看
Expression
类型变量的内容。
您可以清楚地看到lambda是如何转换为表达式的,DB提供程序正是使用这个表达式来转换为SQL。

还有一个类似的问题和一个类似的问题。