我有一个linq to entity
查询。
会Any()
强制执行 linq(就像ToList()
这样)?
有很好的 MSDN 文章Classification of Standard Query Operators by Manner of Execution,它描述了 LINQ 的所有标准运算符。正如您从表中看到的那样,Any
立即执行(作为所有返回单个值的运算符)。如果您对运算符的执行方式有疑问,可以随时参考此表。
是的,没有。该any
方法将立即从源中读取项目,但不能保证读取所有项目。
该Any
方法将从源中枚举项目,但只枚举确定结果所需的数量。
如果没有任何参数,该Any
方法将仅尝试从源中读取第一项。
使用参数,该Any
方法将只从源中读取项目,直到找到满足条件的项目。只有在最后一个项目之前没有项目满足条件时,才会从源中读取所有项目。
这很容易发现:Any() 返回一个简单的布尔值。由于 bool 始终是 bool,而不是可以具有自定义实现的 IQueryable 或 IEnumerable(或任何其他类型),因此我们必须得出结论 Any() 本身必须计算要返回的布尔值。
当然,如果在 IQueryable 的子查询中使用 Any() 则例外,在这种情况下,Linq 提供程序通常只会分析对 Any() 的调用的存在并将其转换为相应的 SQL(例如)。
简短的问题,简短的回答:是的。
要确定列表中的任何元素是否与给定条件匹配(或者是否有任何元素),必须枚举列表。正如MSDN 所说:
此方法不返回集合的任何一个元素。相反,它确定集合是否包含任何元素。 一旦可以确定结果,就停止源的枚举。
延迟执行不适用于此处,因为此方法提供枚举的结果,而不是另一个IEnumerable
。