EntityFramework 多个 Where

11

我想知道,如果我连续使用多个Where(...)方法,EntityFramework是否足够智能,可以将它们合并为一个结果查询。比如说我有:

context.Items
    .Where(item => item.Number > 0)
    .Where(item => item.Number < 5)
    .ToList();

得到的 SQL 查询语句是否与我直接编写的相同:

context.Items
    .Where(item => item.Number > 0 && item.Number < 5)
    .ToList();

多个Where子句是否有任何幕后优化?


它们应该都会为任何大型提供商翻译成相同的SQL。您总是可以尝试两种方法,并查看它们各自生成的SQL。 - Eric J.
1
是的,多个where条件与使用&&连接条件相同(顺便说一下,你可以在大约一分钟内自行验证这一点)。 - Evk
@Evk,如果不深入研究文档和IL,我无法快速验证任何JIT或语法糖优化。请查看我的最后一个问题。谢谢。 - Andrei
3
您可以通过将内容附加到"Log"属性来查看EF提供程序生成的SQL语句。context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); - Spivonious
作为一个惯例,我会在我的查询中调用.ToString()。日志选项非常有用。例如,你可以仅为调试注册记录器,以便在开发应用程序时查看查询。我之前不知道这一点。谢谢! - Andrei
1个回答

7
是的,有这样的机制。实际上,这并不是Entity Framework的作用,而是SQL提供程序工厂的工作,用于组合数据库查询语句。根据您使用的数据库,此代码将来自不同的源代码。
对于MSSQL,该代码是由Microsoft提供的,并在库System.Data.SqlClient中。如果您查看web.config中的连接元素,您应该会注意到属性“providerName”。
在该库或类似库中,通常采用递归访问器模式来浏览定义的Expression Tree对象图,以便生成最有效的查询语句。
使用多个where子句非常容易检测和优化,这些库遇到问题的地方往往是深度嵌套的投影。
如果您使用以下内容,则可以查看查询生成的SQL:
context.Items
.Where(item => item.Number > 0)
.Where(item => item.Number < 5)
.ToString();

谢谢你的回答! - Andrei
如果我使用多个where条件,有没有一种方法可以使用OR而不是AND - shashwat
1
@shashwat - 可以实现这一点,但可能会相当复杂。有简单的方法和困难的方法,你需要哪种取决于你的整体方法结构。这将作为一个独立的问题很好地解决。 - Travis J
感谢@TravisJ。 我只是想知道是否有内置的或简单的解决方案。如果是这样,我会构建一个简单的东西来满足我的需求。再次感谢! - shashwat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接