我想知道,如果我一个接一个地使用多个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子句的幕后优化?
答案 0 :(得分:6)
是的,有。执行此操作的不是实体框架。实际上,SQL Provider Factory的工作是组成数据库的查询。根据您使用的数据库,此代码将来自不同的来源。
对于MSSQL,代码是Microsoft的,并且位于库System.Data.SqlClient
中。如果你在web.config中查看你的连接元素,你应该注意属性“providerName”。
在此库或与其类似的库中,通常使用递归访问者模式来导航定义的表达式树对象图,以便尽可能地生成最有效的查询。
使用多个where子句非常容易检测和优化,这些库存在问题的地方倾向于使用深层嵌套的投影。
如果使用
,您可以看到查询生成的SQLcontext.Items
.Where(item => item.Number > 0)
.Where(item => item.Number < 5)
.ToString();