2016-06-14 47 views
8

我想知道,如果我一个接一个地使用多个Where(...)方法,EntityFramework足够智能,可以将它结合到查询中。比方说,我有:EntityFramework Multiple其中

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子句?

+0

他们都应该转换为相同的SQL任何主要供应商。您可以随时尝试并查看每个产生的SQL。 –

+1

是的倍数与连接条件与&&相同(您可以在一分钟左右验证自己)。 – Evk

+0

@Evk我无法快速验证任何JIT或语法糖的优化,但无需深入研究文档和IL。请看我最后一个问题。谢谢。 – Andrei

回答

5

是的,有。这不是实体框架。实际上,SQL Provider Factory的工作是组成数据库查询。根据您使用的数据库,此代码将来自不同的来源。

对于MSSQL,代码是微软的,代码为System.Data.SqlClient。如果你在你的web.config中查看你的连接元素,你应该注意到属性“providerName”。

在这个库或类似库中,通常使用递归访问者模式来遍历定义的表达式树对象图,以便产生最有效的查询。

使用多个where子句很容易检测和优化,这些类型的库遇到困难的地方往往与深度嵌套投影有关。

就可以看到你的查询生成的SQL如果您使用

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

感谢您的回答! – Andrei