[英]In C# determining if an object o is an Action<…> or Func<…>
[英]In C# EF, does Where(o=>o.Equals(x)) get treated as a client-side func?
遇到代码,其中.Where(o => ox == y)
变为.Where(o => oxEquals(y))
。 我知道==
被EF的SQL生成器解析为在服务器上执行,但不确定.Equals()
。 很明显,这种改变是习惯性的,也许有人来自C ++背景,而不是考虑到==
将被解析为表达式而不是作为函数执行,并且将被转换为SQL的事实。 这个改变编译并运行,但我想知道是否因为EF将其视为Func而不是表达式,因此可能执行通用查询并将过滤器移动到客户端,或类似的荒谬。
从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。
我运行了SQL Profiler。 它生成了“[table]。[x] ='y'”,原来打算使用'=='。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.