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<T> на основе объектного контекста ObjectContext.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сведения о сопоставлении вызовов метода CLR с каноническими функциями в источнике данных см. в разделе CLR Method to Canonical Function Mapping.

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

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

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

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

Материализацией называется процесс возвращения результатов запроса клиенту в виде типов 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

См. также