我有一个linq to entity
查询。
Any()
会强制执行linq(就像ToList()
那样)?
答案 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
。