C# EntityFramework多个,其中

C# EntityFramework多个,其中,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我想知道,如果我一个接一个地使用多个Where(…)方法,EntityFramework是否足够智能,可以将其组合到结果查询中。假设我有: context.Items .Where(item => item.Number > 0) .Where(item => item.Number < 5) .ToList(); context.Items .Where(item=>item.Number>0) .其中(项目=>项目编号item.Number>

我想知道,如果我一个接一个地使用多个
Where(…)
方法,EntityFramework是否足够智能,可以将其组合到结果查询中。假设我有:

context.Items
    .Where(item => item.Number > 0)
    .Where(item => item.Number < 5)
    .ToList();
context.Items
.Where(item=>item.Number>0)
.其中(项目=>项目编号<5)
.ToList();
生成的SQL查询是否与我编写的相同:

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

是否有针对多个Where子句的幕后优化?

是的,有。这不是实体框架做的。实际上,SQL提供者工厂的工作是为数据库编写查询。根据您使用的数据库,此代码将来自不同的源

对于MSSQL,代码是Microsoft的,位于库
System.Data.SqlClient
中。如果查看web.config中的连接元素,您应该注意到属性“providerName”

在这个库或类似的库中,通常使用递归访问者模式在定义的表达式树对象图中导航,以生成尽可能高效的查询

使用多个where子句很容易检测和优化,这类库遇到的问题往往是深度嵌套的投影

如果使用

context.Items
.Where(item => item.Number > 0)
.Where(item => item.Number < 5)
.ToString();
context.Items
.Where(item=>item.Number>0)
.其中(项目=>项目编号<5)
.ToString();

对于任何主要提供商,它们都应转换为相同的SQL。您可以同时尝试这两种方法,并查看每种SQL产生的结果。是的,multiple where与使用&&(顺便说一句,您可以在大约一分钟内验证自己)连接条件相同。@Evk我无法在不深入文档和IL的情况下快速验证任何JIT或语法糖优化。请看我的最后一个问题。谢谢。您可以通过将某些内容附加到日志属性来查看EF提供程序生成的SQL
context.Database.Log=s=>System.Diagnostics.Debug.WriteLine
@Spivonious作为规则,我在查询时调用
.ToString()
。日志选项非常有用。就像在开发应用程序时,您可以仅为调试而注册记录器以查看查询一样。我不知道这件事。谢谢谢谢你的回答!有没有一种方法可以使用
来代替
,如果我使用多个where?@shashwat-这是可能的,但是,它可能相当复杂。这样做有简单的版本,也有困难的版本,这取决于方法的总体结构。这是它自己的问题。谢谢@TravisJ。我只是想知道是否有内置或简单的解决方案。如果是这样的话,我会建立一些简单的东西来满足我的需要。再次感谢!