C# 在C EF中,其中(o=>o.Equals(x))是否被视为客户端函数?

C# 在C EF中,其中(o=>o.Equals(x))是否被视为客户端函数?,c#,linq,entity-framework,C#,Linq,Entity Framework,遇到将.Whereo=>o.x==y更改为.Whereo=>o.x.Equalsy的代码。我知道==是由EF的SQL生成器解析出来在服务器上执行的,但不确定.Equals。很明显,这种改变是习惯的,也许有人从C++背景中出来,而不考虑事实,即= =将被解析为表达式,而不是作为函数执行,并将转换为SQL。这一更改可以编译并运行,但我想知道这是否是因为EF将其视为Func而不是表达式,因此可能会执行一个通用查询并将筛选器移动到客户端,或者类似的荒谬行为。从EF版本6开始,Linq to Entiti

遇到将.Whereo=>o.x==y更改为.Whereo=>o.x.Equalsy的代码。我知道==是由EF的SQL生成器解析出来在服务器上执行的,但不确定.Equals。很明显,这种改变是习惯的,也许有人从C++背景中出来,而不考虑事实,即= =将被解析为表达式,而不是作为函数执行,并将转换为SQL。这一更改可以编译并运行,但我想知道这是否是因为EF将其视为Func而不是表达式,因此可能会执行一个通用查询并将筛选器移动到客户端,或者类似的荒谬行为。

从EF版本6开始,Linq to Entities在客户端不执行任何类型的筛选。如果您试图执行任何类型的不受支持的函数,这意味着它无法转换为EF的IQueryable上的DB提供程序,它将抛出异常

所以答案是:不,它不是在本地执行它

PS:我在某个地方读到过,这个功能是EF7计划中的新增功能,但这是未经证实的,只是猜测而已

更新:此处链接到源:

引用链接失效时的相关部分:

这方面的一个例子是如何处理查询。在EF6.x中,整个LINQ查询被转换为在数据库中执行的单个SQL查询。这意味着您的查询只能包含EF知道如何转换为SQL的内容,并且您通常会得到性能不佳的复杂SQL

在EF7中,我们采用了一种模型,在该模型中,提供者可以选择在数据库中执行查询的哪些位,以及如何执行这些位。这意味着查询现在支持在客户端而不是数据库上评估部分查询。这还意味着提供者可以使用具有多个结果集等的查询,而不是创建一个包含所有内容的单一选择


我运行了SQL分析器。它生成了[table].[x]='y',正如最初使用“==”时所希望的那样。

使用SQL profiler很容易理解。..Equals可能是一个更干净的解决方案,因此EF在转换为SQL之前,将在运行时正确处理对象相等。@JamesC.TaylorIV它如何做到这一点?在OP的例子中,它不知道o的值是?@JamesC.TaylorIV,这句话从头到尾都是胡说八道-它最终生成了完全相同的SQLNote,如果您的对象重写了Equals,那么这可能会产生误导,因为您使用的是SQL相等比较器,而不是您自己的。这是对SQL的预期转换,但如果我希望,我希望它尊重在对象中定义的相等比较,这是不可能的:-如果它确实被重写,看看行为会是什么可能是有趣的。可能会抛出一个异常,检测到它不是System.Object.Equals,而是表示的另一个实现。不幸的是,由于我已经离开了,我的角色还没有真正做另一个测试。呵呵..它不会考虑自定义Equals,而是使用默认实现。此处记录了这一点:。在第一行:EF6将支持具有自定义Equals或GetHashCode实现的POCO实体。EF将改为使用默认实现。请注意,这仅对SQL转换部分有效,它仍然会对返回的哈希集使用相等和哈希代码检查,除非它被代理,但这实际上是在Linq To对象领域