Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
LINQ to Entity предоставляет поддержку Language-Integrated запросов (LINQ), которая позволяет разработчикам создавать запросы к концептуальной модели Entity Framework с помощью Visual Basic или Visual C#. Запросы к Entity Framework представлены запросами дерева команд, которые выполняются в контексте объекта. LINQ to Entity преобразует запросы Language-Integrated (LINQ) в запросы дерева команд, выполняет запросы к Entity Framework и возвращает объекты, которые можно использовать как Entity Framework, так и LINQ. Ниже приведен процесс создания и выполнения запроса LINQ to Entities:
Создание экземпляра ObjectQuery<T> из ObjectContext.
Создайте запрос LINQ to Entities в C# или Visual Basic с помощью экземпляра ObjectQuery<T> .
Преобразуйте стандартные операторы запросов и выражения LINQ в деревья команд.
Выполните запрос в виде представления дерева команд по отношению к источнику данных. Все исключения, создаваемые в источнике данных во время выполнения, передаются непосредственно клиенту.
Результаты запроса возвращаются клиенту.
Создание экземпляра ObjectQuery
Универсальный ObjectQuery<T> класс представляет запрос, возвращающий коллекцию нулевых или более типизированных сущностей. Запрос объекта обычно создается из существующего контекста объекта, а не создается вручную и всегда принадлежит к контексту этого объекта. Этот контекст предоставляет сведения о подключении и метаданных, необходимых для создания и выполнения запроса. Универсальный ObjectQuery<T> класс реализует универсальный IQueryable<T> интерфейс, методы построителя которого позволяют добавочно создавать запросы LINQ. Вы также можете разрешить компилятору определить тип сущностей с помощью ключевого слова C# var
(Dim
в Visual Basic с включенным выводом локального типа).
Создание запросов
Экземпляры универсального ObjectQuery<T> класса, реализующего универсальный IQueryable<T> интерфейс, служат источником данных для запросов LINQ to Entity. В запросе вы указываете точно сведения, которые требуется получить из источника данных. Запрос также может указать, как эти сведения должны быть отсортированы, сгруппированы и сформированы перед возвратом. В LINQ запрос хранится в переменной. Эта переменная запроса не принимает никаких действий и не возвращает данные; Он хранит только сведения о запросе. После создания запроса необходимо выполнить этот запрос, чтобы получить все данные.
Запросы LINQ to Entity можно создавать в двух разных синтаксисах: синтаксис выражения запроса и синтаксис запросов на основе метода. Синтаксис выражений запросов и синтаксис запросов на основе метода являются новыми в C# 3.0 и Visual Basic 9.0.
Дополнительные сведения см. в разделе "Запросы" в LINQ to Entity.
Преобразование запросов
Чтобы выполнить запрос LINQ to Entities с использованием Entity Framework, запрос LINQ необходимо преобразовать в представление дерева команд, которое можно выполнить в Entity Framework.
Запросы LINQ to Entities состоят из стандартных операторов запросов LINQ (например, Select, Where, и GroupBy) и выражений (x > 10, Contact.LastName и т. д.). Операторы LINQ не определяются классом, а являются методами класса. В LINQ выражения могут содержать все, что разрешено типами в System.Linq.Expressions пространстве имен, и по расширению все, что может быть представлено в лямбда-функции. Это супермножество выражений, разрешенных Entity Framework, которые по определению ограничены операциями, разрешенными в базе данных, и поддерживаются ObjectQuery<T>.
В Entity Framework операторы и выражения представлены одной иерархией типов, которая затем помещается в дерево команд. Дерево команд используется Entity Framework для выполнения запроса. Если запрос LINQ не может быть выражен в виде дерева команд, при преобразовании запроса создается исключение. Преобразование запросов LINQ to Entity включает два вложенных преобразования: преобразование стандартных операторов запросов и преобразование выражений.
Существует ряд стандартных операторов запросов LINQ, которые не имеют допустимого перевода в LINQ to Entities. Попытки использовать эти операторы вызовут исключение в момент перевода запроса. Список поддерживаемых операторов LINQ to Entities см. в разделе "Поддерживаемые и неподдерживаемые методы LINQ " (LINQ to Entities)".
Дополнительные сведения об использовании стандартных операторов запросов в LINQ to Entities см. в разделе "Стандартные операторы запросов в запросах LINQ to Entities".
Как правило, выражения в сущностях 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 Entity)
Стандартные операторы запросов в запросах LINQ to Entity
Метод CLR для сопоставления с канонической функцией
Поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities)
Известные проблемы и соображения в LINQ to Entities