LINQ to Entities

LINQ to Entities обеспечивает поддержку LINQ при запросах к сущностям. Компонент позволяет разработчикам писать запросы к концептуальной модели Entity Framework на языке Visual Basic или Visual C#. Запросы к платформе Entity Framework представляются в виде дерева команд запроса, выполняемого на контексте объектов. Технология LINQ to Entities преобразует запросы Language-Integrated Queries (LINQ) в запросы в виде дерева команд, выполняет эти запросы на платформе Entity Framework и возвращает объекты, которые могут использоваться как платформой Entity Framework, так и технологией LINQ. Далее описывается процесс создания и исполнения запроса в технологии LINQ to Entities.

  1. Создайте экземпляр запроса ObjectQuery на основе объектного контекста ObjectContext.

  2. Создайте запрос по технологии LINQ to Entities на языке C# или Visual Basic с помощью экземпляра ObjectQuery.

  3. Преобразуйте стандартные операторы и выражения запросов LINQ в деревья команд.

  4. Выполните запрос в виде дерева команд применительно к источнику данных. Все исключения, возникшие в источнике данных во время выполнения, передаются непосредственно клиенту.

  5. Верните результаты запроса обратно клиенту.

Создание экземпляра ObjectQuery

Универсальный класс ObjectQuery представляет собой запрос, возвращающий коллекцию, содержащую ноль, одну или несколько типизированных сущностей. Как правило, запрос объектов создается на основе существующего контекста объекта, а не вручную, и всегда принадлежит этому контексту объекта. В этом контексте содержится информация о соединении и метаданных, необходимая для создания и выполнения запроса. Универсальный класс ObjectQuery реализует общий интерфейс IQueryable, методы построителя которого позволяют пошагово строить запросы LINQ. Можно также разрешить компилятору вывести тип сущностей при помощи ключевого слова C# var (Dim в Visual Basic, если разрешено выведение локальных типов).

Составление запросов

Экземпляры универсального класса ObjectQuery, реализующего общий интерфейс IQueryable, служат источниками данных для запросов по технологии LINQ to Entities. В запросе точно указывается, какие данные надо получить из источника. В запросе также можно указать, как должны сортироваться, группироваться и оформляться возвращаемые данные. В LINQ запрос хранится в переменной. Эта переменная запроса не выполняет никаких действий и не возвращает данные. Она только хранит информацию о запросе. После создания запроса его необходимо выполнить, чтобы получить данные.

Создание запросов LINQ to Entities может производиться с использованием синтаксиса выражений запросов или синтаксиса запросов на основе методов. Синтаксические конструкции выражения запроса и запроса, основанном на методе, впервые появились в версиях языков C# 3.0 и Visual Basic 9.0.

Дополнительные сведения см. в разделе Запросы в LINQ to Entities.

Преобразование запросов

Для выполнения запроса в технологии LINQ to Entities на платформе Entity Framework запрос LINQ нужно преобразовать в дерево команд, которое можно выполнить на платформе Entity Framework.

Запросы в технологии LINQ to Entities состоят из стандартных операторов запросов (в частности, Select, Where и GroupBy) и выражений (x > 10, Contact.LastName и т. п.) технологии LINQ. Операторы LINQ не определяются классом, а являются методами класса. В LINQ выражения могут содержать любые конструкции, допустимые для типов в пределах пространства имен System.Linq.Expressions, а по расширению — любые конструкции, которые могут быть представлены лямбда-функциями. Это надмножество выражений, допустимых для платформы Entity Framework, множество которых по определению ограничено допустимыми операциями над базой данных и поддерживается посредством ObjectQuery.

На платформе Entity Framework и операторы, и выражения представляются одной иерархией типов, которая затем помещается в дерево команд. Дерево команд используется платформой Entity Framework для выполнения запроса. Если запрос LINQ не удается выразить в виде дерева команд, при преобразовании запроса будет создано исключение. Преобразование запросов LINQ to Entities включает два промежуточных преобразования — стандартных операторов запросов и выражений.

Для ряда стандартных операторов запроса LINQ не существует допустимых эквивалентов в технологии LINQ to Entities. Попытки использования этих операторов приведут к возникновению исключения в процессе перевода запроса. Список операторов, поддерживаемых технологией LINQ to Entities, см. в разделе Поддерживаемые и неподдерживаемые методы LINQ (язык LINQ to Entities).

Дополнительные сведения об использовании стандартных операторов запросов в технологии LINQ to Entities см. в разделе Стандартные операторы запросов в запросах LINQ to Entities.

Как правило, выражения технологии LINQ to Entities вычисляются на сервере, поэтому нельзя ожидать, что поведение выражений будет соответствовать семантике среды CLR. Дополнительные сведения см. в разделе Выражения в запросах LINQ to Entities.

Дополнительные сведения о сопоставлении вызовов методов среды CLR с каноническими функциями в источнике данных см. в разделе Сопоставление методов CLR каноническим функциям.

Дополнительные сведения о вызове канонических функций, функций баз данных и пользовательских функций из запросов LINQ to Entities см. в разделе Вызов функций в запросах LINQ to Entities.

Выполнение запроса

После создания пользователем запроса LINQ он преобразуется в представление, совместимое с Entity Framework (в виде дерева команд), которое затем выполняется для источника данных. Во время выполнения запроса все выражения (или компоненты) этого запроса вычисляются на клиенте либо на сервере. Это относится и к выражениям, используемым для материализации результатов и для проекции сущностей. Дополнительные сведения см. в разделе Выполнение запроса. Дополнительные сведения о повышении производительности за счет однократной компиляции и последующего многократного выполнения запросов с разными параметрами см. в разделе Скомпилированные запросы (LINQ to Entities).

Материализация

Материализацией называется процесс возвращения результатов запроса клиенту в виде типов CLR. В LINQ to Entities результаты запроса никогда не возвращаются в виде записей данных. Для этого всегда используется базовый тип CLR, который был определен пользователем или платформой Entity Framework или создан компилятором (анонимный тип). Вся материализация объектов проводится платформой Entity Framework. Все ошибки, вызванные невозможностью сопоставления между платформой Entity Framework и средой CLR, вызовут создание исключений во время материализации объекта.

Результаты запроса обычно возвращаются в одной из следующих форм.

  • Коллекция, содержащая ноль или более типизированных объектов сущностей, либо проекция сложных типов, определенных в концептуальной модели.

  • Типы CLR, поддерживаемые Entity Framework .

  • Встроенные коллекции.

  • Анонимные типы.

Дополнительные сведения см. в разделе Результаты запроса.

В этом разделе

Запросы в LINQ to Entities

Выражения в запросах LINQ to Entities

Вызов функций в запросах LINQ to Entities

Скомпилированные запросы (LINQ to Entities)

Выполнение запроса

Результаты запроса

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

Сопоставление методов CLR каноническим функциям

Поддерживаемые и неподдерживаемые методы LINQ (язык LINQ to Entities)

Известные проблемы и замечания по LINQ to Entities

См. также

Основные понятия

Известные проблемы и замечания по LINQ to Entities
Платформа ADO.NET Entity Framework

Другие ресурсы

Language-Integrated Query (LINQ)
LINQ and ADO.NET