Стандартные операторы запросов в запросах LINQ to Entities
В запросе указываются данные, которые необходимо получить из источника данных. В запросе можно также указать, как следует сортировать, группировать и формировать возвращаемую информацию. Технология LINQ предоставляет набор стандартных методов запросов, которые можно использовать в запросах. Большинство этих методов работают с последовательностями. В данном контексте последовательность — это объект, тип которого реализует интерфейс IEnumerable или IQueryable. Функциональные возможности стандартных операторов запросов включают фильтрацию, проекцию, статистическую обработку, сортировку, группирование, разбиение на страницы и т. д. У некоторых наиболее часто используемых стандартных операторов запросов существует выделенный синтаксис ключевого слова, поэтому оператор можно вызвать с помощью синтаксиса выражения запроса. Выражение запроса — это другой, более легко читаемый способ создания запросов, отличающийся от способа, основанного на использовании методов. Предложения выражений запросов преобразуются в вызовы методов запросов во время компиляции. Список стандартных операторов запросов, имеющих эквивалентные предложения выражений запросов, см. в разделе Standard Query Operators Overview.
В запросах LINQ to Entities поддерживаются не все стандартные операторы запросов. Дополнительные сведения см. в разделе Поддерживаемые и неподдерживаемые методы (LINQ to Entities). В этом разделе предоставлены сведения о стандартных операторах запросов, уникальных для запросов LINQ to Entities. Дополнительные сведения о стандартных операторах запросов см. в разделе LINQ General Programming Guide. Дополнительные сведения об известных проблемах в запросах LINQ to Entities см. в разделе Известные проблемы и замечания по LINQ to Entities.
Методы проекции и фильтрации
Проекция — это преобразование элементов результирующего набора в нужную форму. Например, можно проецировать необходимое подмножество свойств из каждого объекта в результирующем наборе, или свойство и произвести с ним математическое вычисление, или целый объект из результирующего набора. Методами проекции являются методы Select и SelectMany.
Фильтрация — это операция по ограничению значений в результирующем наборе только элементами, соответствующими указанному условию. Методом фильтрации является метод Where.
Большинство перегрузок методов проекции и фильтрации поддерживаются в LINQ to Entities, за исключением тех, которые принимают позиционные аргументы.
Список поддерживаемых и неподдерживаемых методов проекции и фильтрации см. в разделе Методы проекций и ограничений (LINQ to Entities).
Методы соединения
Соединение является важной операцией в запросах, обращающихся к целевым источникам данных, не имеющим связей друг с другом, по которым можно перемещаться. Соединение двух источников данных — это ассоциация объектов в одном источнике данных с объектами в другом источнике, имеющем общий атрибут или свойство. Методами соединения являются методы Join и GroupJoin.
Поддерживается большинство перегрузок методов соединения, за исключением тех, в которых используется интерфейс IEqualityComparer. Причина этого заключается в том, что сравнивающий класс не может быть преобразован в источник данных.
Список поддерживаемых и неподдерживаемых методов соединения см. в разделе Методы соединения (язык LINQ to Entities).
Методы наборов
Операции с наборами в LINQ — это операции запросов, результирующие наборы которых основываются на наличии или отсутствии эквивалентных элементов в одной или другой коллекции (или наборе). Методами наборов являются методы All, Any, Concat, Contains, DefaultIfEmpty, Distinct, EqualAll, Except, Intersect и Union.
Большинство перегрузок методов наборов поддерживаются в LINQ to Entities, хотя и существуют некоторые отличия в поведении по сравнению с технологией LINQ to Objects. Однако методы наборов, использующих интерфейс IEqualityComparer, не поддерживаются, поскольку сравнивающий класс не может быть преобразован в источник данных.
Список поддерживаемых и неподдерживаемых методов наборов см. в разделе Методы работы с наборами (LINQ to Entities).
Методы упорядочения
Упорядочение (или сортировка) — это упорядочение элементов в результирующем наборе на основе одного или нескольких атрибутов. Указав более одного критерия сортировки, можно разорвать связи внутри группы.
Поддерживается большинство перегрузок методов упорядочения, за исключением тех, в которых используется интерфейс IComparer. Причина этого заключается в том, что сравнивающий класс не может быть преобразован в источник данных. Методами упорядочения являются методы OrderBy, OrderByDescending, ThenBy, ThenByDescending и Reverse.
Поскольку запрос выполняется в источнике данных, упорядочение может выполняться иначе, чем для запросов, выполняемых в среде CLR. Причина этого заключается в том, что в источнике данных могут быть определены настройки сортировки, например сортировка с учетом регистра, иероглифическая сортировка и сортировка значений NULL. В зависимости от источника данных результаты, полученные с этими настройками сортировки, могут отличаться от результатов, полученных в среде CLR.
Если один и тот же селектор ключа будет указан в более чем одной операции сортировки, будет выполнена повторяющаяся сортировка. Это недопустимо, поэтому будет выдано исключение.
Список поддерживаемых и неподдерживаемых методов упорядочения см. в разделе Методы упорядочения (LINQ to Entities).
Методы группирования
Группирование — это размещение данных в группах таким образом, чтобы у элементов в каждой группе был общий атрибут. Методом группирования является метод GroupBy.
Поддерживается большинство перегрузок методов группирования, за исключением тех, в которых используется интерфейс IEqualityComparer. Причина этого заключается в том, что сравнивающий класс не может быть преобразован в источник данных.
Методы группирования сопоставляются с источником данных с помощью отдельного вложенного запроса для селектора ключа. Вложенный запрос сравнения селектора ключа выполняется с использованием семантики источника данных, включая сравнение значений null.
Список поддерживаемых и неподдерживаемых методов группирования см. в разделе Методы группирования (LINQ to Entities).
Методы статистической обработки
Статистическая операция вычисляет одно значение по коллекции значений. Например, статистической операцией является вычисление средней дневной температуры с использованием значений дневной температуры за месяц. Статистическими методами являются методы Aggregate, Average, Count, LongCount, Max, Min и Sum. Список поддерживаемых и неподдерживаемых методов статистической обработки см. в разделе Статистические методы (LINQ to Entities).
Поддерживается перегрузка большинства статистических методов. В отношении работы со значениями 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, в последовательности. |
Вычисляет сумму последовательности числовых значений. |
Методы типов
В контексте Entity Framework поддерживаются два метода LINQ, выполняющие преобразование и проверку типов. Это значит, что поддерживаются только те типы, которые сопоставляются с подходящими типами Entity Framework. Список этих типов см. в разделе Типы модели EDM. Методами типов являются методы Convert и OfType.
Для типов сущностей поддерживается метод OfType. Для типов-примитивов модели EDM поддерживается метод Convert. Методы C# is и as также поддерживаются.
Методы постраничного просмотра
Операции постраничного просмотра возвращают из последовательности один конкретный элемент. Методами элементов являются методы ElementAt, First, FirstOrDefault, Last, LastOrDefault, Single, Skip, Take, TakeWhile.
Часть методов постраничного просмотра не поддерживается ввиду невозможности сопоставления функций с источником данных либо ввиду отсутствия неявного упорядочения наборов в источнике данных. Методы, возвращающие значения по умолчанию, ограничены типами-примитивами модели EDM и ссылочными типами со значениями по умолчанию NULL. Методы постраничного просмотра, примененные к пустой последовательности, возвращают значение NULL.
Список поддерживаемых и неподдерживаемых методов элементов см. в разделе Методы постраничного просмотра (LINQ to Entities).
См. также
Основные понятия
Поддерживаемые и неподдерживаемые методы (LINQ to Entities)
Другие ресурсы
Выполнение запросов с помощью LINQ to Entities
Standard Query Operators Overview