`Any()`是否强制执行linq?

时间:2013-02-05 07:45:56

标签: c# entity-framework

我有一个linq to entity查询。

Any()会强制执行linq(就像ToList()那样)?

4 个答案:

答案 0 :(得分:11)

有一篇非常好的MSDN文章Classification of Standard Query Operators by Manner of Execution,它描述了LINQ的所有标准运算符。正如您在表Any中看到的那样,立即执行(作为返回单个值的所有运算符)。如果您对操作员执行方式有疑问,可以随时参考此表。

答案 1 :(得分:2)

是的,不。 any方法会立即从源中读取项目,但不保证会读取所有项目。

Any方法将枚举来自源的项目,但只能确定结果所需的数量。

没有任何参数,Any方法只会尝试从源中读取第一项。

使用参数,Any方法只会从源中读取项目,直到找到满足条件的项目。如果在最后一项之前没有项目满足条件,则仅从源读取所有项目。

答案 2 :(得分:1)

这很容易发现:Any()返回一个简单的bool。由于bool始终是bool,而不是可以具有自定义实现的IQueryable或IEnumerable(或任何其他类型),因此我们必须得出结论,Any()本身必须计算要返回的布尔值。

当然,例外情况是在IQueryable的子查询中使用Any(),在这种情况下,Linq提供程序通常只会分析是否存在对Any()的调用并将其转换为相应的SQL(例如)。

答案 3 :(得分:1)

简短的问题,简短的回答:是的。

要确定列表的任何元素是否与给定条件匹配(或者根本没有任何元素),必须枚举列表。正如MSDN states

  

此方法不返回集合的任何一个元素。相反,它确定集合是否包含任何元素。   一旦确定结果,就会停止源的枚举。

此处不适用延迟执行,因为此方法提供枚举的结果,而不是另一个IEnumerable

相关问题