LINQ扩展方法 – Any()与Where()与Exists()

不幸的是,这些方法的名称使可怕的search条件,我一直无法find一个很好的资源,解释这些方法之间的差异 – 就像在什么时候使用每个。

谢谢。

编辑:

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

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

并感谢所有已经回答的人。

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

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

我不确定Exists – 这不是一个LINQ标准的查询操作符。 如果有一个Entity Framework的版本,也许它会根据一个密钥检查是否存在 – 一种Any的特殊forms? ( List<T> Exists方法,它与Any(predicate)类似,但是早于LINQ。)

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

a.Books 。图书是该作者的书籍清单。 该属性是由Linq-to-Sql自动创build的,前提是您设置了外键关系。

因此, a.Books.Any(b => b.BookID == bookID)转换为“这个作者的任何书籍都有一个bookID的ID”,这使得完整的expression“谁是书的作者id bookID?“

这也可以写成类似的东西

  from a in context.Authors join b in context.Books on a.AuthorId equal b.AuthorID where b.BookID == bookID select a; 

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

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

只要你下次可以find它,这里是你如何search可枚举的Linq扩展。 这些方法是Enumerable的静态方法,因此Enumerable.Any,Enumerable.Where和Enumerable.Exists。

  • google.com/search?q=Enumerable.Any
  • google.com/search?q=Enumerable.Where
  • google.com/search?q=Enumerable.Exists

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

  • google.com/search?q=List.Exists

我也推荐hookedonlinq.com,因为这是一个非常全面和清晰的指南,也清楚地解释了Linq方法在延迟和懒惰方面的行为。

任何 – 布尔函数,当列表中的任何对象满足在函数参数中设置的条件时返回true。 例如:

 List<string> strings = LoadList(); boolean hasNonEmptyObject = strings.Any(s=>string.IsNullOrEmpty(s)); 

其中 – 函数返回列表中的所有对象,满足在函数参数中设置的条件。 例如:

 IEnumerable<string> nonEmptyStrings = strings.Where(s=> !string.IsNullOrEmpty(s)); 

存在 – 基本上与任何一样,但它不是通用的 – 它在List类中定义,而Any在IEnumerable接口上定义。

IEnumerable引入了相当多的扩展,它可以帮助你传递你自己的委托并从IEnumerable返回结果。 他们中的大部分都是Functypes的本质

Func接受一个参数T并返回TResult。

的情况下

其中 – Func:所以它需要T的IEnumerable并返回一个布尔值。 最终将返回Func返回true的T的IEnumerable。

所以如果你有1,5,3,6,7作为IEnumerable,你写了.where(r => r <5),它将返回一个新的IEnumerable 1,3。

任何 – Func在签名上基本上是相似的,但只有当任何条件对IEnumerable返回true时才返回true。 在我们的情况下,它将返回true,因为在r <5时存在less量元素。

存在 – 另一方面谓词只有在任何一个谓词返回true时才会返回true。 所以在我们的情况下,如果你传递.Exists(r => 5)将返回true,因为5是IEnumerable中的一个元素。

如果集合中的任何元素满足谓词的条件,则Any()将返回true。

Where()返回符合谓词条件的集合中所有元素的枚举。

Exists()和其他任何东西都是一样的,除了它是Linq之前在IList中的一个旧实现。