C# 使用多个.Where()调用或&&;LinqToEntities查询的条件
以下两个查询是否等效?如果它们不相等,哪一个性能更好?有没有办法查看查询的sql输出C# 使用多个.Where()调用或&&;LinqToEntities查询的条件,c#,entity-framework,C#,Entity Framework,以下两个查询是否等效?如果它们不相等,哪一个性能更好?有没有办法查看查询的sql输出 var query1 = items.Where(i => i.Enabled == true).Where(i => i.Name == "Bob"); var query2 = items.Where(i => i.Enabled == true && i.Name == "Bob"); 这两个查询都将转换为同一个SQL—如果需要,您可以使用LinqPad之类的工具来验
var query1 = items.Where(i => i.Enabled == true).Where(i => i.Name == "Bob");
var query2 = items.Where(i => i.Enabled == true && i.Name == "Bob");
这两个查询都将转换为同一个SQL—如果需要,您可以使用LinqPad之类的工具来验证这一点(我刚刚做了)。将表达式树转换为T-SQL的LINQ提供程序足够聪明,可以理解这些查询是同义的。当然,这意味着这两个查询的性能相同。正如Andrew所说,这两个选项是等效的。一个实际有用的区别是,您可以轻松地以编程方式在
Where
子句中生成条件。例如,如果要排除某些名称:
var query = items;
for(string name in excluded)
query = query.Where(i => i.Name != excluded);
这是使用
&&
运算符编写查询时无法轻松完成的。查询有什么问题。其中(i=>!exluded.Contains(i.Name))
?上次检查的EF不支持Contains。另外,这只是一个示例,通常您只想使用那些具有值的过滤器,因此它变成if(foo!=null)(query=query.where(x=>x.foo==foo)@Jamiec:如果支持包含
,那么当然可以。但是,在中编写子句是更一般的方法-您可以使用它来表示更一般的条件。@Andrey,@Thomas:包含
在EF 4中受支持,但在EF 1中不受支持。