是Where(条件).Any()和Any(条件)等价物

Dan*_*ely 5 c# linq

我使用Any方法查看Linq查询的大约一半示例通过将其应用于Where()调用的结果来实现,另一半直接将其应用于集合.两种风格是否总是相同的,或者是否存在可以返回不同结果的情况?

我的测试支持前一个结论; 但边缘情况并不总是很容易找到.

List<MyClass> stuff = GetStuff();
bool found1 = stuff.Where(m => m.parameter == 1).Any();
bool found2 = stuff.Any(m => m.parameter == 1);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

这归结为两个重要问题:

  • 它是标准的“Where”/“Any”(例如 Enumerable.* 或 Queryable.*),还是自定义的?(如果是后者,则一切皆废)
  • 如果是 Queryable.*,那么提供者是什么?

后者非常重要。例如,LINQ-to-SQL 和 LINQ-to-EF 对于 Single 的行为不同,因此我不会假设它们对于 Any 的行为相同。一个更深奥的提供者可以做任何事情。但更多的是:LINQ-to-SQL 对 Single(predicate) 与Where(predicate).Single(以及 First)执行不同的操作(重新身份管理器)。事实上,LINQ-to-SQL 中有 3 种不同的可用行为,具体取决于 3.5、3.5SP1 或 4.0。

此外,IIRC LINQ-to-ADO.NET-Data-Services 对 EF 具有不同的(相反,从记忆中)支持 - 因此(再次从记忆中),虽然一个提供程序仅支持 Single(谓词),另一个提供程序仅支持Where(谓词) 。单身的(); 暗示 Any() 可能受到不同提供商的类似影响并不是一个很大的飞跃。

所以:虽然 Any(predicate) 和Where(predicate).Any()在语义上是等效的 - 如果没有非常详细的上下文信息,就不可能说它们是否实际上相同。