不幸的是,这些方法的名称作为搜索词非常糟糕,我一直找不到一个好的资源来解释这些方法之间的差异--如何选择使用哪个。
谢谢。
编辑:
我试图完全理解的查询类似于这样:
context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
感谢所有回答过的人。
不幸的是,这些方法的名称作为搜索词非常糟糕,我一直找不到一个好的资源来解释这些方法之间的差异--如何选择使用哪个。
谢谢。
编辑:
我试图完全理解的查询类似于这样:
context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
感谢所有回答过的人。
Where
方法返回一个新的由满足条件的元素组成的序列。
Any
方法返回一个布尔值;它有一个带有谓词的版本(在这种情况下,它返回是否存在任何匹配项),也有一个不带谓词的版本(在这种情况下,它返回查询至今是否包含任何项)。
我对Exists
方法不太确定 - 它不是LINQ标准查询运算符。如果存在Entity Framework的版本,则可能基于键检查存在性 - 这是一种特殊形式的Any
吗?(List<T>中有一个类似于Any(predicate)
的Exists
方法,但它比LINQ更早。)
List<T>
的一部分,而不是LINQ的一部分。 - Jon Skeet.Any
和 .Exists
是完全相同的。 - FlaterExists
的哪个版本?List<T>.Exists
? - Jon Skeetcontext.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
a.Books
是该作者的书籍列表。只要你已经建立了外键关系,Linq-to-Sql 就会自动创建该属性。
因此,a.Books.Any(b => b.BookID == bookID)
的意思是“这位作者的任何一本书的 ID 是否为 bookID”,完整表达式的意思是“写有编号为 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;
}
以下是可枚举的Linq扩展的搜索方法。这些方法都是Enumerable类的静态方法,因此有Enumerable.Any、Enumerable.Where和Enumerable.Exists。为方便下次查找,您可以搜索以下链接:
由于第三个方法没有可用结果,我认为您指的是List.Exists,因此可以使用以下链接:
我还建议您访问hookedonlinq.com,因为该网站提供了非常全面和清晰的指南,以及关于Linq方法与延迟和惰性相关行为的明确解释。
Any - 布尔函数,当列表中的任何对象满足函数参数中设置的条件时返回true。例如:
List<string> strings = LoadList();
boolean hasNonEmptyObject = strings.Any(s=>string.IsNullOrEmpty(s));
Where - 函数返回满足函数参数中设定条件的所有对象列表。例如:
IEnumerable<string> nonEmptyStrings = strings.Where(s=> !string.IsNullOrEmpty(s));
Exists - 与任何其他方法基本相同,但它不是通用的 - 它是在List类中定义的,而Any是在IEnumerable接口中定义的。
IEnumerable<T>
。 - Jon SkeetAny()
函数会返回集合中是否存在任意一个元素满足谓词条件,如果有则返回true。(Any()
不会遍历整个集合,它在找到第一个匹配项后就会停止遍历。)
Where()
函数会返回一个枚举集合,其中包含所有满足谓词条件的元素。
Exists()
函数与Any()
函数做的事情相同,只是它是早期实现的版本,在LINQ出现之前就存在于List
中。
List<T>
。 - Jon SkeetIEnumerable引入了许多扩展方法,可以帮助您传递自己的委托并从IEnumerable返回结果。其中大部分都是Func类型。
Func接受一个参数T并返回TResult。
在Where的情况下 - Func:它接受T的IEnumerable并返回bool。where最终将返回Func返回true的T的IEnumerable。
因此,如果您有1,5,3,6,7作为IEnumerable,并编写.where(r => r<5),它将返回新的IEnumerable 1,3。
Any - Func基本上具有相似的签名,但仅当任何条件对IEnumerable返回true时才返回true。在我们的例子中,它将返回true,因为存在一些元素r<5。
Exists - 另一方面,谓词仅在任何一个谓词返回true时才返回true。因此,在我们的例子中,如果您传递.Exists(r => 5),它将返回true,因为5是IEnumerable中存在的元素。
foreach (var item in model.Where(x => !model2.Any(y => y.ID == x.ID)).ToList())
{
enter code here
}
你也可以使用Contains
来完成同样的工作。
其次,Where
会给你一个新的值列表。
第三,使用Exist
不是一个好习惯,你可以通过Any
和contains
来实现你的目标。
EmployeeDetail _E = Db.EmployeeDetails.where(x=>x.Id==1).FirstOrDefault();
希望这能解决你的困惑。