不幸的是,这些方法的名称产生了可怕的搜索术语,我一直无法找到解释这些方法之间差异的好资源 - 就像何时使用每种方法一样.
谢谢.
编辑:
我试图完全理解的那种查询是这样的:
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之前的方法.)
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)
这样你下次就可以找到它,这里是你如何搜索可枚举的Linq扩展.这些方法是Enumerable的静态方法,因此Enumerable.Any,Enumerable.Where和Enumerable.Exists.
由于第三个没有返回可用的结果,我发现你的意思是List.Exists,因此:
我也推荐hookedonlinq.com,因为它有非常全面和清晰的指南,以及Linq方法在延迟和懒惰方面的行为的清晰解释.
归档时间: |
|
查看次数: |
105764 次 |
最近记录: |