Методы расширения LINQ и любой() и, где() и существует()


к сожалению, названия этих методов делают ужасные условия поиска, и я не смог найти хороший ресурс, который объясняет разницу между этими методами-как в том, когда использовать каждый.

спасибо.

Edit:

тип запроса, который я пытаюсь полностью понять, что-то вроде этого:

context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();

и спасибо всем, кто ответил.

6 53

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() насколько я знаю, только возвращает a bool. Его эффективная реализация:

 public Any(this IEnumerable<T> coll, Func<T, bool> predicate)
 {
     foreach(T t in coll)
     {
         if (predicte(t))
            return true;
     }
     return false;
 }

просто чтобы вы могли найти его в следующий раз, вот как вы ищете перечислимые расширения Linq. Методы являются статическими методами Перечислимого, таким образом Перечислимого.Любой, Перечислимый.Где и перечислим.Существует.

как третий возвращает нет полезный результат, я обнаружил, что вы имели в виду список.Существует, таким образом:

Я также рекомендую 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.