LINQ extension methods - Any() vs. Where() vs. Exists()
Solution 1:
Where
returns a new sequence of items matching the predicate.
Any
returns a Boolean value; there's a version with a predicate (in which case it returns whether or not any items match) and a version without (in which case it returns whether the query-so-far contains any items).
I'm not sure about Exists
- it's not a LINQ standard query operator. If there's a version for the Entity Framework, perhaps it checks for existence based on a key - a sort of specialized form of Any
? (There's an Exists
method in List<T>
which is similar to Any(predicate)
but that predates LINQ.)
Solution 2:
context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
a.Books
is the list of books by that author. The property is automatically created by Linq-to-Sql, provided you have a foreign-key relationship set up.
So, a.Books.Any(b => b.BookID == bookID)
translates to "Do any of the books by this author have an ID of bookID", which makes the complete expression "Who are the authors of the book with id bookID?"
That could also be written something like
from a in context.Authors
join b in context.Books on a.AuthorId equal b.AuthorID
where b.BookID == bookID
select a;
UPDATE:
Any()
as far as I know, only returns a bool
. Its effective implementation is:
public Any(this IEnumerable<T> coll, Func<T, bool> predicate)
{
foreach(T t in coll)
{
if (predicte(t))
return true;
}
return false;
}
Solution 3:
Just so you can find it next time, here is how you search for the enumerable Linq extensions. The methods are static methods of Enumerable, thus Enumerable.Any, Enumerable.Where and Enumerable.Exists.
- google.com/search?q=Enumerable.Any
- google.com/search?q=Enumerable.Where
google.com/search?q=Enumerable.Exists
As the third returns no usable result, I found that you meant List.Exists, thus:
- google.com/search?q=List.Exists
I also recommend hookedonlinq.com as this is has very comprehensive and clear guides, as well clear explanations of the behavior of Linq methods in relation to deferness and lazyness.