Стандартные операторы запросов в запросах LINQ to Entities

В запросе указывается информация, которую требуется извлечь из источника данных. Запрос также может указать, как эти сведения должны быть отсортированы, сгруппированы и сформированы перед возвратом. LINQ предоставляет набор стандартных методов запроса, которые можно использовать в запросе. Большинство этих методов работают на последовательностях; В этом контексте последовательность — это объект, тип которого реализует IEnumerable<T> интерфейс или IQueryable<T> интерфейс. Стандартные функции запросов операторов запросов включают фильтрацию, проекцию, агрегирование, сортировку, группирование, разбиение по страницам и многое другое. Некоторые из наиболее часто используемых стандартных операторов запросов имеют выделенный синтаксис ключевых слов, чтобы их можно было вызывать с помощью синтаксиса выражения запроса. Выражение запроса — это другой, более читаемый способ выражения запроса, чем эквивалент на основе метода. Предложения выражений запросов переводятся в вызовы методов запроса во время компиляции. Список стандартных операторов запросов, имеющих эквивалентные предложения выражений запроса, см. в обзоре стандартных операторов запросов.

Не все стандартные операторы запросов поддерживаются в запросах LINQ to Entity. Дополнительные сведения см. в разделе "Поддерживаемые и неподдерживаемые методы LINQ " (LINQ to Entities)". В этом разделе содержатся сведения о стандартных операторах запросов, относящихся к сущностям LINQ to Entities. Дополнительные сведения о известных проблемах в запросах LINQ to Entity см. в разделе "Известные проблемы и рекомендации" в LINQ to Entity.

Методы проекции и фильтрации

Проекция относится к преобразованию элементов результирующих наборов в нужную форму. Например, можно проецить подмножество свойств, необходимых для каждого объекта в результирующем наборе, вы можете проецвести свойство и выполнить математические вычисления по нему или проецвести весь объект из результируемого набора. Методы проекции — это Select и SelectMany.

Фильтрация относится к операции ограничения результирующих наборов только теми элементами, которые соответствуют указанному условию. Метод фильтрации — Where.

Большинство перегрузок методов проекции и фильтрации поддерживаются в сущностях LINQ to Entities, за исключением тех, которые принимают позиционный аргумент.

Методы соединения

Соединение является важной операцией в запросах, предназначенных для источников данных, которые не имеют между собой навигационных связей. Соединение двух источников данных — это связь объектов в одном источнике данных с объектами в другом источнике данных, который использует общий атрибут или свойство. Методы соединения — это Join и GroupJoin.

Большинство перегрузок методов соединения поддерживаются, за исключением тех, которые используют IEqualityComparer<T>. Это связано с тем, что средство сравнения не может быть преобразовано в источник данных.

Задать методы

Операции установки в LINQ — это операции запросов, которые основывают их результирующие наборы на наличие или отсутствие эквивалентных элементов в той же или другой коллекции (или наборе). Методы набора: All, Any, Concat, Contains, DefaultIfEmpty, Distinct, EqualAll, Except, Intersect и Union.

Большинство перегрузок сетевых методов поддерживаются в LINQ to Entities, хотя существуют некоторые различия в поведении по сравнению с LINQ to Objects. Однако методы, которые используют IEqualityComparer<T>, не поддерживаются, так как средство сравнения не может быть преобразовано в источник данных.

Методы упорядочивания

Упорядочивание или сортировка ссылается на упорядочение элементов результирующей группы на основе одного или нескольких атрибутов. Задав несколько критериев сортировки, можно разбить связи в группе.

Большинство перегрузок методов упорядочения поддерживается, за исключением тех, которые используют IComparer<T>. Это связано с тем, что средство сравнения не может быть преобразовано в источник данных. Методы упорядочения: OrderBy, OrderByDescending, ThenByThenByDescendingи Reverse.

Так как запрос выполняется в источнике данных, поведение упорядочивания может отличаться от запросов, выполняемых в среде CLR. Это связано с тем, что параметры упорядочивания, такие как упорядочивание по регистру, упорядочивание по кандзи и упорядочивание пустых значений, могут быть заданы в источнике данных. В зависимости от источника данных эти параметры упорядочения могут привести к различным результатам, отличным от среды CLR.

Если указать один и тот же селектор ключей в нескольких операциях упорядочивания, будет создано повторяющееся упорядочение. Это недопустимо, и будет создано исключение.

Методы группировки

Группирование относится к размещению данных в группы, чтобы элементы в каждой группе совместно используют общий атрибут. Метод группировки — это GroupBy.

Большинство перегрузок методов группировки поддерживается, за исключением тех, которые используют IEqualityComparer<T>. Это связано с тем, что средство сравнения не может быть преобразовано в источник данных.

Методы группировки сопоставляются с источником данных, используя отдельный подзапрос для селектора ключей. Вложенный запрос сравнения селекторов ключей выполняется с помощью семантики источника данных, включая аспекты, связанные с сравнением null значений.

Агрегатные методы

Операция агрегирования вычисляет одно значение из коллекции значений. Например, вычисление средней дневной температуры из множества значений дневной температуры за месяц является агрегацией. Методы агрегирования: Aggregate, Average, Count, LongCount, Max, Min, и Sum.

Поддерживаются большинство перегрузок агрегатных методов. Для поведения, связанного с значениями NULL, агрегатные методы используют семантику источника данных. Поведение методов агрегирования при использовании значений NULL может отличаться в зависимости от используемого внутреннего источника данных. Поведение агрегатного метода по семантике источника данных может отличаться от ожидаемого поведения методов CLR. Например, поведение по умолчанию для Sum метода в SQL Server заключается в том, чтобы игнорировать значения NULL вместо исключения.

Все исключения, возникающие в результате агрегирования, такие как переполнение функции Sum, выбрасываются как исключения источника данных или исключения Entity Framework в процессе материализации результатов запроса.

Для таких методов, которые включают вычисление по последовательности, например Sum или Averageфактические вычисления выполняются на сервере. В результате на сервере могут возникать преобразования типов и потеря точности, а результаты могут отличаться от ожидаемого использования семантики CLR.

Поведение статистических методов по умолчанию для значений null/non-NULL показано в следующей таблице:

Метод Нет данных. Все неопределенные значения Некоторые нулевые значения Нет пустых значений
Average Возвращает значение NULL. Возвращает значение NULL. Возвращает среднее значение значений, отличных от NULL, в последовательности. Вычисляет среднее значение последовательности числовых значений.
Count Возвращает значение 0 Возвращает число значений NULL в последовательности. Возвращает количество значений null и не-null в последовательности. Возвращает количество элементов в последовательности.
Max Возвращает значение NULL. Возвращает значение NULL. Возвращает максимальное значение, отличное от NULL, в последовательности. Возвращает максимальное значение последовательности.
Min Возвращает значение NULL. Возвращает значение NULL. Возвращает минимальное значение, отличное от NULL, в последовательности. Возвращает минимальное значение в последовательности.
Sum Возвращает значение NULL. Возвращает значение NULL. Возвращает сумму ненулевого значения в последовательности. Вычисляет сумму последовательности числовых значений.

Методы типа

Два метода LINQ, которые работают с преобразованием типов и тестированием, поддерживаются в контексте Entity Framework. Это означает, что единственными поддерживаемыми типами являются типы, которые сопоставляются с соответствующим типом Entity Framework. Список этих типов см. в разделе "Концептуальные типы моделей" (CSDL). Методы типа: Convert и OfType.

OfType поддерживается для типов сущностей. Convert поддерживается для примитивных типов концептуальной модели. Также поддерживаются C# is и as методы.

Методы разбиения по страницам

Операции разбиения по страницам возвращают один элемент или несколько элементов из последовательности. Поддерживаемые методы разбиения по страницам: First, FirstOrDefault, Single, SingleOrDefaultSkipи Take.

Некоторые методы разбиения по страницам не поддерживаются из-за невозможности сопоставления функций с источником данных или отсутствия неявного порядка наборов в источнике данных. Методы, возвращающие значение по умолчанию, ограничены примитивными типами концептуальной модели и ссылочными типами с значениями null по умолчанию. Методы разбиения по страницам, выполняемые в пустой последовательности, возвращают значение NULL.

См. также