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中的一个旧实现。