LINQ to EntitiesLINQ to Entities

LINQ to Entities обеспечивает поддержку LINQ при запросах к сущностям. Компонент позволяет разработчикам писать запросы к концептуальной модели Entity Framework на языке Visual Basic или Visual C#.LINQ to Entities provides Language-Integrated Query (LINQ) support that enables developers to write queries against the Entity Framework conceptual model using Visual Basic or Visual C#. Запросы к платформе Entity Framework представляются в виде дерева команд запроса, выполняемого на контексте объектов.Queries against the Entity Framework are represented by command tree queries, which execute against the object context. Технология LINQ to Entities преобразует запросы Language-Integrated Queries (LINQ) в запросы в виде дерева команд, выполняет эти запросы на платформе Entity Framework и возвращает объекты, которые могут использоваться как платформой Entity Framework, так и технологией LINQ.LINQ to Entities converts Language-Integrated Queries (LINQ) queries to command tree queries, executes the queries against the Entity Framework, and returns objects that can be used by both the Entity Framework and LINQ. Далее описывается процесс создания и исполнения запроса в технологии LINQ to Entities.The following is the process for creating and executing a LINQ to Entities query:

  1. Создайте экземпляр запроса ObjectQuery<T> на основе объектного контекста ObjectContext.Construct an ObjectQuery<T> instance from ObjectContext.

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

  3. Преобразуйте стандартные операторы и выражения запросов LINQ в деревья команд.Convert LINQ standard query operators and expressions to command trees.

  4. Выполните запрос в виде дерева команд применительно к источнику данных.Execute the query, in command tree representation, against the data source. Все исключения, возникшие в источнике данных во время выполнения, передаются непосредственно клиенту.Any exceptions thrown on the data source during execution are passed directly up to the client.

  5. Верните результаты запроса обратно клиенту.Return query results back to the client.

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

Универсальный класс ObjectQuery<T> представляет собой запрос, возвращающий коллекцию, содержащую ноль, одну или несколько типизированных сущностей.The ObjectQuery<T> generic class represents a query that returns a collection of zero or more typed entities. Как правило, запрос объектов создается на основе существующего контекста объекта, а не вручную, и всегда принадлежит этому контексту объекта.An object query is typically constructed from an existing object context, instead of being manually constructed, and always belongs to that object context. В этом контексте содержится информация о соединении и метаданных, необходимая для создания и выполнения запроса.This context provides the connection and metadata information that is required to compose and execute the query. Универсальный класс ObjectQuery<T> реализует общий интерфейс IQueryable<T>, методы построителя которого позволяют пошагово строить запросы LINQ.The ObjectQuery<T> generic class implements the IQueryable<T> generic interface, whose builder methods enable LINQ queries to be incrementally built. Можно также разрешить компилятору вывести тип сущностей при помощи ключевого слова C# var (Dim в Visual Basic, если разрешено выведение локальных типов).You can also let the compiler infer the type of entities by using the C# var keyword (Dim in Visual Basic, with local type inference enabled).

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

Экземпляры универсального класса ObjectQuery<T>, реализующего общий интерфейс IQueryable<T>, служат источниками данных для запросов по технологии LINQ to Entities.Instances of the ObjectQuery<T> generic class, which implements the generic IQueryable<T> interface, serve as the data source for LINQ to Entities queries. В запросе точно указывается, какие данные надо получить из источника.In a query, you specify exactly the information that you want to retrieve from the data source. В запросе можно также указать, как следует сортировать, группировать и формировать возвращаемую информацию.A query can also specify how that information should be sorted, grouped, and shaped before it is returned. В LINQ запрос хранится в переменной.In LINQ, a query is stored in a variable. Эта переменная запроса не выполняет никаких действий и не возвращает данные. Она только хранит информацию о запросе.This query variable takes no action and returns no data; it only stores the query information. После создания запроса его необходимо выполнить, чтобы получить данные.After you create a query you must execute that query to retrieve any data.

Создание запросов LINQ to Entities может производиться с использованием синтаксиса выражений запросов или синтаксиса запросов на основе методов.LINQ to Entities queries can be composed in two different syntaxes: query expression syntax and method-based query syntax. Синтаксические конструкции выражения запроса и запроса на основе методов впервые появились в версиях языков C# 3.0 и Visual Basic 9.0.Query expression syntax and method-based query syntax are new in C# 3.0 and Visual Basic 9.0.

Дополнительные сведения см. в разделе запросы в LINQ to Entities.For more information, see Queries in LINQ to Entities.

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

Для выполнения запроса в технологии LINQ to Entities на платформе Entity Framework запрос LINQ нужно преобразовать в дерево команд, которое можно выполнить на платформе Entity Framework.To execute a LINQ to Entities query against the Entity Framework, the LINQ query must be converted to a command tree representation that can be executed against the Entity Framework.

Запросы в технологии LINQ to Entities состоят из стандартных операторов запросов (в частности, Select, Where и GroupBy) и выражений (x > 10, Contact.LastName и т. п.) технологии LINQ.LINQ to Entities queries are comprised of LINQ standard query operators (such as Select, Where, and GroupBy) and expressions (x > 10, Contact.LastName, and so on). Операторы LINQ не определяются классом, а являются методами класса.LINQ operators are not defined by a class, but rather are methods on a class. В LINQ выражения могут содержать любые конструкции, допустимые для типов в пределах пространства имен System.Linq.Expressions, а по расширению - любые конструкции, которые могут быть представлены лямбда-функциями.In LINQ, expressions can contain anything allowed by types within the System.Linq.Expressions namespace and, by extension, anything that can be represented in a lambda function. Это надмножество выражений, допустимых для платформы Entity Framework, множество которых по определению ограничено допустимыми операциями над базой данных и поддерживается посредством ObjectQuery<T>.This is a superset of the expressions that are allowed by the Entity Framework, which are by definition restricted to operations allowed on the database, and supported by ObjectQuery<T>.

На платформе Entity Framework и операторы, и выражения представляются одной иерархией типов, которая затем помещается в дерево команд.In the Entity Framework, both operators and expressions are represented by a single type hierarchy, which are then placed in a command tree. Дерево команд используется платформой Entity Framework для выполнения запроса.The command tree is used by the Entity Framework to execute the query. Если запрос LINQ не удается выразить в виде дерева команд, при преобразовании запроса будет создано исключение.If the LINQ query cannot be expressed as a command tree, an exception will be thrown when the query is being converted. Преобразование запросов LINQ to Entities включает два промежуточных преобразования - стандартных операторов запросов и выражений.The conversion of LINQ to Entities queries involves two sub-conversions: the conversion of the standard query operators, and the conversion of the expressions.

Для ряда стандартных операторов запроса LINQ не существует допустимых эквивалентов в технологии LINQ to Entities.There are a number of LINQ standard query operators that do not have a valid translation in LINQ to Entities. Попытки использования этих операторов приведут к возникновению исключения в процессе перевода запроса.Attempts to use these operators will result in an exception at query translation time. Список поддерживаемых операторы LINQ to Entities, см. в разделе поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities).For a list of supported LINQ to Entities operators, see Supported and Unsupported LINQ Methods (LINQ to Entities).

Дополнительные сведения об использовании стандартных операторов запросов в LINQ to Entities см. в разделе стандартных операторов запросов в запросах LINQ to Entities.For more information about using the standard query operators in LINQ to Entities, see Standard Query Operators in LINQ to Entities Queries.

Как правило, выражения технологии LINQ to Entities вычисляются на сервере, поэтому нельзя ожидать, что поведение выражений будет соответствовать семантике среды CLR.In general, expressions in LINQ to Entities are evaluated on the server, so the behavior of the expression should not be expected to follow CLR semantics. Дополнительные сведения см. в разделе выражения в запросах LINQ to Entities.For more information, see Expressions in LINQ to Entities Queries.

Сведения о том, как вызовы методов CLR сопоставляются с каноническими функциями в источнике данных, см. в разделе методов CLR с сопоставление канонической функции.For information about how CLR method calls are mapped to canonical functions in the data source, see CLR Method to Canonical Function Mapping.

Сведения о вызове канонических, базы данных и пользовательских функций из LINQ to EntitiesLINQ to Entities запросы, см. в разделе вызов функций в запросах LINQ to Entities.For information about how to call canonical, database, and custom functions from within LINQ to EntitiesLINQ to Entities queries, see Calling Functions in LINQ to Entities Queries.

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

После создания пользователем запроса LINQ он преобразуется в представление, совместимое с Entity Framework (в виде дерева команд), которое затем выполняется для источника данных.After the LINQ query is created by the user, it is converted to a representation that is compatible with the Entity Framework (in the form of command trees), which is then executed against the data source. Во время выполнения запроса все выражения (или компоненты) этого запроса вычисляются на клиенте либо на сервере.At query execution time, all query expressions (or components of the query) are evaluated on the client or on the server. Это относится и к выражениям, используемым для материализации результатов и для проекции сущностей.This includes expressions that are used in result materialization or entity projections. Дополнительные сведения см. в разделе выполнения запроса.For more information, see Query Execution. Сведения о том, как повысить производительность путем компилирования запроса один раз и затем выполнить его несколько раз с разными параметрами см. в разделе компилированные запросы (LINQ to Entities).For information on how to improve performance by compiling a query once and then executing it several times with different parameters, see Compiled Queries (LINQ to Entities).

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

Материализацией называется процесс возвращения результатов запроса клиенту в виде типов CLR.Materialization is the process of returning query results back to the client as CLR types. В LINQ to Entities результаты запроса никогда не возвращаются в виде записей данных. Для этого всегда используется базовый тип CLR, который был определен пользователем или платформой Entity Framework или создан компилятором (анонимный тип).In LINQ to Entities, query results data records are never returned; there is always a backing CLR type, defined by the user or by the Entity Framework, or generated by the compiler (anonymous types). Вся материализация объектов проводится платформой Entity Framework.All object materialization is performed by the Entity Framework. Все ошибки, вызванные невозможностью сопоставления между платформой Entity Framework и средой CLR, вызовут создание исключений во время материализации объекта.Any errors that result from an inability to map between the Entity Framework and the CLR will cause exceptions to be thrown during object materialization.

Результаты запроса обычно возвращаются в одной из следующих форм.Query results are usually returned as one of the following:

  • Коллекция, содержащая ноль или более типизированных объектов сущностей, либо проекция сложных типов, определенных в концептуальной модели.A collection of zero or more typed entity objects or a projection of complex types defined in the conceptual model.

  • Типы CLR, поддерживаемые Entity FrameworkEntity Framework.CLR types that are supported by the Entity FrameworkEntity Framework.

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

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

Дополнительные сведения см. в разделе результаты запроса.For more information, see Query Results.

В этом разделеIn This Section

Запросы в LINQ to EntitiesQueries in LINQ to Entities

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

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

Компилированные запросы (LINQ to Entities)Compiled Queries (LINQ to Entities)

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

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

Стандартные операторы запроса в запросах LINQ to EntitiesStandard Query Operators in LINQ to Entities Queries

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

Поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities)Supported and Unsupported LINQ Methods (LINQ to Entities)

Рекомендации и известные проблемы в LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities

См. такжеSee Also

Рекомендации и известные проблемы в LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities
Встроенный язык запросов LINQLINQ (Language-Integrated Query)
LINQ и ADO.NETLINQ and ADO.NET
ADO.NET Entity FrameworkADO.NET Entity Framework