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

Jon*_*vis 3 c# linq entity-framework

遇到代码.Where(o => o.x == y)已更改为.Where(o => o.x.Equals(y)).我知道==EF的SQL生成器解析了它在服务器上执行,但不确定.Equals().很明显,这种改变是习惯性的,可能是某人从C++背景出来而没有考虑==将被解析为表达式而不是作为函数执行的事实,并且将被转换为SQL.这个改变编译并运行,但我想知道是否因为EF将其视为Func而不是表达式,因此可能执行通用查询并将过滤器移动到客户端,或类似的荒谬.

Jcl*_*Jcl 6

从EF版本6开始,Linq-To-Entities不会在客户端中执行任何类型的过滤.如果您尝试在EF上执行任何类型的不受支持的功能(意味着它无法转换为数据库提供程序)IQueryable,它将抛出异常.

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

PS:我已经读到某个地方,这个功能是EF7的计划添加,但这是未经证实的,只是猜测

更新:链接到源:http://blogs.msdn.com/b/adonet/archive/2014/10/27/ef7-v1-or-v7.aspx

如果链接失效,请引用相关部分:

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

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