4

我有一个linq to entity查询。

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

4

4 回答 4

13

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

于 2013-02-05T07:52:37.710 回答
2

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

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

如果没有任何参数,该Any方法将仅尝试从源中读取第一项。

使用参数,该Any方法将只从源中读取项目,直到找到满足条件的项目。只有在最后一个项目之前没有项目满足条件时,才会从源中读取所有项目。

于 2013-02-05T07:55:01.803 回答
1

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

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

于 2013-02-05T07:47:37.470 回答
1

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

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

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

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

于 2013-02-05T07:48:52.260 回答