Поделиться через


Стандартные операторы в запросах 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, 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, SingleOrDefaultSkipи Take.

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

См. также