Методы расширения LINQ и любой() и, где() и существует()
к сожалению, названия этих методов делают ужасные условия поиска, и я не смог найти хороший ресурс, который объясняет разницу между этими методами-как в том, когда использовать каждый.
спасибо.
Edit:
тип запроса, который я пытаюсь полностью понять, что-то вроде этого:
context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
и спасибо всем, кто ответил.
6 ответов:
Where
возвращает новую последовательность элементов, удовлетворяющих предикату.
Any
возвращает логическое значение; есть версия с предикатом (в этом случае она возвращает, совпадают ли какие-либо элементы) и версия без (в этом случае она возвращает, содержит ли запрос до сих пор какие-либо элементы).Я не уверен насчет
Exists
- это не стандартный оператор запроса LINQ. Если есть версия для Entity Framework, возможно, она проверяет существование на основе ключа-a своего рода специализированная формаAny
? (Там естьExists
методList<T>
который похож наAny(predicate)
но это предшествует LINQ.)
контексте.Авторы.Где (a => A.книги.Любой (b => b.BookID == bookID)).ToList ();
a.Books
список книг автора. Свойство автоматически создается Linq-to-Sql, если у вас настроено отношение внешнего ключа.и
a.Books.Any(b => b.BookID == bookID)
переводится как "у любой из книг этого автора есть идентификатор 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()
насколько я знаю, только возвращает abool
. Его эффективная реализация:public Any(this IEnumerable<T> coll, Func<T, bool> predicate) { foreach(T t in coll) { if (predicte(t)) return true; } return false; }
просто чтобы вы могли найти его в следующий раз, вот как вы ищете перечислимые расширения Linq. Методы являются статическими методами Перечислимого, таким образом Перечислимого.Любой, Перечислимый.Где и перечислим.Существует.
- google.com/search?q=Enumerable.Any
- google.com/search?q=Enumerable.Where
google.com/search?q=Enumerable.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));
существует-в основном то же самое, что и любой, но он не является универсальным - он определен в классе List, в то время как любой определяется на интерфейсе IEnumerable.
IEnumerable вводит довольно много расширений к нему, который помогает вам передать свой собственный делегат и вызов результирующего из IEnumerable обратно. Большинство из них по своей природе типа Func
функция принимает аргумент T и возвращает TResult.
в случае
Where-Func: таким образом, он принимает IEnumerable из T и возвращает bool. Where will в конечном итоге возвращает IEnumerable из T, для которого Func возвращает true.
Так что если вы есть 1,5,3,6,7 как IEnumerable и вы пишете .где (r = > r
Any-Func в основном аналогичен сигнатуре, но возвращает true только тогда, когда любой из критериев возвращает true для IEnumerable. В нашем случае он вернет true, так как есть несколько элементов, присутствующих с r
существует - предикат с другой стороны вернет true только тогда, когда любой из предикатов возвращает true. Так что в нашем случае, если вы проходите .Существует (r => 5) будет return true as 5-это элемент, присутствующий в IEnumerable.
Any () возвращает true, если какой-либо из элементов в коллекции соответствует критериям вашего предиката.
Where () возвращает перечисляемый из всех элементов в коллекции, которые соответствуют критериям вашего предиката.
Exists () делает то же самое, что и любой, за исключением того, что это просто более старая реализация, которая была там в IList до Linq.