LINQ扩展方法 - Any()vs. Where()vs. Exists()

asf*_*adf 58 c# linq

不幸的是,这些方法的名称产生了可怕的搜索术语,我一直无法找到解释这些方法之间差异的好资源 - 就像何时使用每种方法一样.

谢谢.

编辑:

我试图完全理解的那种查询是这样的:

context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
Run Code Online (Sandbox Code Playgroud)

感谢所有回答的人.

Jon*_*eet 93

Where 返回与谓词匹配的新项目序列.

Any返回一个布尔值; 有一个带谓词的版本(在这种情况下,它返回是否有任何项匹配)和没有版本(在这种情况下,它返回查询到目前为止是否包含任何项).

我不确定Exists- 它不是LINQ标准查询运算符.如果有实体框架的版本,也许它会根据密钥检查是否存在 - 一种特殊的形式Any?(有一种Exists方法List<T>类似于Any(predicate)LINQ之前的方法.)

  • @JonH:是的,正如我发布的那样,它是`List <T>`的一部分 - 不是LINQ的一部分. (8认同)

Jam*_*ran 8

context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();

a.Books是该作者的书籍清单.如果您设置了外键关系,则该属性由Linq-to-Sql自动创建.

因此,a.Books.Any(b => b.BookID == bookID)翻译为"此作者的任何书籍都有一个bookID的ID",这使得完整的表达"谁是具有id bookID的书籍的作者?"

这也可以写成类似的东西

  from a in context.Authors
  join b in context.Books on a.AuthorId equal b.AuthorID
  where b.BookID == bookID
  select a;
Run Code Online (Sandbox Code Playgroud)

更新: Any()据我所知,只返回一个bool.其有效实施是:

 public Any(this IEnumerable<T> coll, Func<T, bool> predicate)
 {
     foreach(T t in coll)
     {
         if (predicte(t))
            return true;
     }
     return false;
 }
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到问题.Any()返回一个bool,Where()需要一个bool.大家都很开心! (2认同)

Dyk*_*kam 7

这样你下次就可以找到它,这里是你如何搜索可枚举的Linq扩展.这些方法是Enumerable的静态方法,因此Enumerable.Any,Enumerable.Where和Enumerable.Exists.

由于第三个没有返回可用的结果,我发现你的意思是List.Exists,因此:

我也推荐hookedonlinq.com,因为它有非常全面和清晰的指南,以及Linq方法在延迟和懒惰方面的行为的清晰解释.