LINQ中的“and”和“wheres”之间有实际区别吗?

3

我有这个查询

 from a in objects
 where a.property1 == 2
 && a.property2 == 3
 select a

并且

from a in objects
where a.property1 == 2
where a.property2 == 3
select a

我想知道语句执行方式是否有实质性的差别,同时使用它们的好处是什么。

目前我的问题是关于linq to objects的。


2
Linq to objects,entities,xml,sql? - Paul Fleming
我不知道你可以像你现在这样使用两次 where - DJ Burb
@Burb,结果将只是Where扩展调用的链.Where(...).Where(...) - Ilya Ivanov
3个回答

4

您的第一个案例将被转换为:

objects.Where(a => a.property1 == 2 && a.property2 == 3);

而后者将被转换为:

objects.Where(a => a.property1 == 2).Where(a => a.property2 == 3);

后者会被过滤两次,而第一个则是在lambda中进行比较。这是基于LINQ-to-Objects的假设;其他提供程序将取决于实现。

0

实际上,这两个语句是相同的,因为C#只有在左侧为true时才评估AND操作的右侧。

如果C#不懒惰地进行AND评估,那么顺序的WHERE评估可能会在大多数项目未能满足第一个标准(或第二个标准是昂贵的评估)的情况下提供相当显著的性能提升。然而,由于C#默认是懒惰的,因此执行效果与懒惰评估的LINQ相当。


如果 C# 不懒惰地评估 &&,那么 LINQ 将在接受项目进入结果之前检查两个属性。很难说这样做是否比先循环第一个结果,然后再次过滤(导致更多的内存分配)表现得更好,因为情况各不相同。我猜前者在大多数情况下会更快——一次全部完成——特别是因为它将立即减少列表的大小,这意味着内部分配的内存更少。由于它是惰性的,所以在大多数情况下肯定会更快。 - pickypg

0

如果基础的LINQ提供程序不同,那么就会有所差异。LINQ提供程序负责将LINQ查询转换为底层的函数表示,例如SQL。

对我来说,真正的区别在于可读性。两个链接的where语句会降低可读性。


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