Стандартные операторы в запросах LINQ to Entities
В запросе указывается, какие данные надо получить из источника. В запросе можно также указать, как следует сортировать, группировать и формировать возвращаемую информацию. Технология LINQ предоставляет набор стандартных методов запросов, которые можно использовать в запросах. Большинство из этих методов работают с последовательностями; В этом контексте последовательность — это объект, тип которого реализует IEnumerable<T> интерфейс или IQueryable<T> интерфейс . Функциональные возможности стандартных операторов запросов включают фильтрацию, проекцию, статистическую обработку, сортировку, группирование, разбиение на страницы и т. д. У некоторых наиболее часто используемых стандартных операторов запросов существует выделенный синтаксис ключевого слова, поэтому оператор можно вызвать с помощью синтаксиса выражения запроса. Выражение запроса - это другой, более легко читаемый способ создания запросов, отличающийся от способа, основанного на использовании методов. Предложения выражений запросов преобразуются в вызовы методов запросов во время компиляции. Список стандартных операторов запросов с эквивалентными предложениями выражений запроса см. в статье Общие сведения о стандартных операторах запросов.
Не все стандартные операторы запросов поддерживаются в LINQ to Entities запросах. Дополнительные сведения см. в разделе Поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities). В этом разделе содержатся сведения о стандартных операторах запросов, относящихся к LINQ to Entities. Дополнительные сведения об известных проблемах в запросах LINQ to Entities см. в разделе Известные проблемы и рекомендации в LINQ to Entities.
Методы проекции и фильтрации
Проекция означает преобразование элементов результирующих наборов в нужную форму. Например, можно проецировать необходимое подмножество свойств из каждого объекта в результирующем наборе, или свойство и произвести с ним математическое вычисление, или целый объект из результирующего набора. Методами проекции являются методы 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. Однако методы set, использующие объект , IEqualityComparer<T> не поддерживаются, так как компаратор не может быть преобразован в источник данных.
Методы упорядочивания
Упорядочение (или сортировка) — это упорядочение элементов в результирующем наборе на основе одного или нескольких атрибутов. Указав более одного критерия сортировки, можно разорвать связи внутри группы.
Поддерживается большинство перегрузок методов упорядочивания, за исключением тех, в которых используется интерфейс IComparer<T>. Это происходит потому, что сравнивающий класс нельзя преобразовать в источник данных. Методами упорядочивания являются методы OrderBy
, OrderByDescending
, ThenBy
, ThenByDescending
и Reverse
.
Поскольку запрос выполняется к источнику данных, поведение упорядочивания может отличаться от поведения запросов, выполненных в среде CLR. Это происходит, потому что в источнике данных могут быть заданы параметры упорядочения, такие как упорядочение с учетом регистра, упорядочение с учетом символов кандзи и упорядочение значений null. В зависимости от источника данных эти параметры упорядочения могут приводить к результатам, отличающимся от результатов в среде 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 и значениям, отличным от NULL, отображено в следующей таблице:
Метод | Нет данных | Все значения NULL | Некоторые значения NULL | Нет значений NULL |
---|---|---|---|---|
Average |
Возвращает значение NULL. | Возвращает значение NULL. | Возвращает среднее значение от значений последовательности, отличных от NULL. | Вычисляет среднее значение для последовательности числовых значений. |
Count |
Возвращает значение 0 | Возвращает число значений null в последовательности. | Возвращает число значений null и значений, отличных от null, в последовательности. | Возвращает число элементов в последовательности. |
Max |
Возвращает значение NULL. | Возвращает значение NULL. | Возвращает максимальное значение, отличное от NULL, в последовательности. | Возвращает максимальное значение в последовательности. |
Min |
Возвращает значение NULL. | Возвращает значение NULL. | Возвращает минимальное значение, отличное от NULL, в последовательности. | Возвращает минимальное значение в последовательности. |
Sum |
Возвращает значение NULL. | Возвращает значение NULL. | Возвращает сумму значений, отличных от NULL, в последовательности. | Вычисляет сумму последовательности числовых значений. |
Методы типов
Два метода LINQ, которые работают с преобразованием и тестированием типов, поддерживаются в контексте Entity Framework. Это означает, что поддерживаются только типы, которые сопоставляются с соответствующим типом Entity Framework. Список этих типов см. в разделе Типы концептуальных моделей (CSDL). Методами типов являются методы Convert
и OfType
.
OfType
поддерживается для типов сущностей. Convert
поддерживается для типов-примитивов концептуальной модели. Методы C# is
и as
также поддерживаются.
Методы постраничного просмотра
Операции разбиения по страницам возвращают один элемент или несколько элементов из последовательности. Поддерживаемые методы разбиения по страницам: First
, FirstOrDefault
, Single
, SingleOrDefault
, Skip
и Take
.
Некоторые методы разбиения по страницам не поддерживаются из-за невозможности сопоставить функции с источником данных или отсутствия неявного порядка наборов в источнике данных. Методы, возвращающие значения по умолчанию, ограничены типами-примитивами концептуальной модели и ссылочными типами со значениями по умолчанию, равными null. Методы постраничного просмотра, примененные к пустой последовательности, возвращают значение NULL.