繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM