LINQ to EntitiesLINQ to Entities

O LINQ to Entities fornece suporte a LINQ (Consulta Integrada à Linguagem) que permite aos desenvolvedores escreverem consultas no modelo conceitual do Entity Framework usando Visual Basic ou 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#. As consultas no Entity Framework são representadas por consultas de árvore de comando, que são executadas no contexto de objeto.Queries against the Entity Framework are represented by command tree queries, which execute against the object context. O LINQ to Entities converte consultas do LINQ (Consulta Integrada à Linguagem) para consultas de árvore de comando, executa as consultas no Entity Framework e retorna os objetos que podem ser usados pelo Entity Framework e pelo 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. Veja a seguir o processo para criar e executar uma consulta LINQ to Entities:The following is the process for creating and executing a LINQ to Entities query:

  1. Construa uma instância ObjectQuery<T> do ObjectContext.Construct an ObjectQuery<T> instance from ObjectContext.

  2. Componha uma consulta LINQ to Entities no C# ou Visual Basic usando a instância ObjectQuery<T>.Compose a LINQ to Entities query in C# or Visual Basic by using the ObjectQuery<T> instance.

  3. Converta operadores e expressões padrão de consulta LINQ para árvores de comando.Convert LINQ standard query operators and expressions to command trees.

  4. Execute a consulta, na representação da árvore de comando, na fonte de dados.Execute the query, in command tree representation, against the data source. Todas as exceções geradas na fonte de dados durante a execução são passadas diretamente até o cliente.Any exceptions thrown on the data source during execution are passed directly up to the client.

  5. Retorne os resultados da consulta de volta para o cliente.Return query results back to the client.

Construindo uma instância de ObjectQueryConstructing an ObjectQuery Instance

A classe genérica ObjectQuery<T> representa uma consulta que retorna uma coleção de zero ou mais entidades tipadas.The ObjectQuery<T> generic class represents a query that returns a collection of zero or more typed entities. Uma consulta de objeto é construída normalmente de um contexto de objeto existente, em vez de ser construído manualmente, e sempre pertence ao contexto de objeto.An object query is typically constructed from an existing object context, instead of being manually constructed, and always belongs to that object context. Esse contexto fornece a conexão e as informações de metadados necessárias para compor e executar a consulta.This context provides the connection and metadata information that is required to compose and execute the query. A classe genérica ObjectQuery<T> implementa a interface genérica IQueryable<T>, cujos métodos de construtor habilitam as consultas LINQ para serem criadas incrementalmente.The ObjectQuery<T> generic class implements the IQueryable<T> generic interface, whose builder methods enable LINQ queries to be incrementally built. Você também pode permitir que o compilador infira o tipo de entidade usando a palavra-chave var do C# (Dim no Visual Basic, com inferência de tipo de local habilitada).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).

Compondo as consultasComposing the Queries

As instâncias da classe genérica ObjectQuery<T>, que implementa a interface de IQueryable<T>, funcionam como a fonte de dados para consultas 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. Em uma consulta, você especifica exatamente as informações que deseja recuperar da fonte de dados.In a query, you specify exactly the information that you want to retrieve from the data source. Uma consulta também pode especificar como essas informações devem ser classificadas, agrupadas e moldadas antes de serem retornadas.A query can also specify how that information should be sorted, grouped, and shaped before it is returned. No LINQ, uma consulta é armazenada em uma variável.In LINQ, a query is stored in a variable. Essa variável de consulta não toma nenhuma ação e não retorna nenhum dado, ela apenas armazena as informações da consulta.This query variable takes no action and returns no data; it only stores the query information. Depois de criar uma consulta, você deve executá-la para recuperar todos os dados.After you create a query you must execute that query to retrieve any data.

As consultas LINQ to Entities podem ser compostas de duas sintaxes diferentes: sintaxe de expressão de consulta e sintaxe de consulta baseada em método.LINQ to Entities queries can be composed in two different syntaxes: query expression syntax and method-based query syntax. A sintaxe da expressão de consulta e a sintaxe da consulta com base em método são novidades no C# 3.0 e no Visual Basic 9.0.Query expression syntax and method-based query syntax are new in C# 3.0 and Visual Basic 9.0.

Para obter mais informações, consulte consultas no LINQ to Entities.For more information, see Queries in LINQ to Entities.

Conversão de consultaQuery Conversion

Para executar uma consulta LINQ to Entities no Entity Framework, a consulta LINQ deve ser convertida em uma representação de árvore de comando que pode ser executada no 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.

Consultas LINQ to Entities são compostas de operadores de consulta padrão LINQ (como Select, Where, e GroupBy) e expressões (x > 10, Contact e assim por diante).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). Os operadores LINQ não são definidos por uma classe, mas são métodos em uma classe.LINQ operators are not defined by a class, but rather are methods on a class. No LINQ, as expressões podem conter tudo o que é permitido por tipos dentro do namespace System.Linq.Expressions e, por extensão, tudo o que pode ser representado em uma função lambda.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. Este é um superconjunto de expressões que são permitidas pelo Entity Framework, que são restritas por definição para as operações permitidas no banco de dados, e têm suporte pelo 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>.

No Entity Framework, os operadores e as expressões são representados por uma única hierarquia de tipo, que são colocadas em uma árvore de comando.In the Entity Framework, both operators and expressions are represented by a single type hierarchy, which are then placed in a command tree. A árvore de comando é usada pelo Entity Framework para executar a consulta.The command tree is used by the Entity Framework to execute the query. Se a consulta LINQ não puder ser expressada como uma árvore de comando, uma exceção será gerada quando a consulta estiver sendo convertida.If the LINQ query cannot be expressed as a command tree, an exception will be thrown when the query is being converted. A conversão de consultas LINQ to Entities envolve duas subconversões: a conversão dos operadores de consulta padrão e a conversão das expressões.The conversion of LINQ to Entities queries involves two sub-conversions: the conversion of the standard query operators, and the conversion of the expressions.

Há um número de operadores padrão de consulta LINQ que não têm uma tradução válida no LINQ to Entities.There are a number of LINQ standard query operators that do not have a valid translation in LINQ to Entities. As tentativas de usar esses operadores resultarão em uma exceção em tempo de tradução de consulta.Attempts to use these operators will result in an exception at query translation time. Para obter uma lista com suporte operadores LINQ to Entities, consulte com suporte e os métodos LINQ (LINQ to Entities).For a list of supported LINQ to Entities operators, see Supported and Unsupported LINQ Methods (LINQ to Entities).

Para obter mais informações sobre como usar os operadores de consulta padrão no LINQ to Entities, consulte operadores de consulta padrão em consultas 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.

Em geral, as expressões no LINQ to Entities são avaliadas no servidor. Portanto, não se deve esperar que o comportamento da expressão siga a semântica de 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. Para obter mais informações, consulte expressões em consultas LINQ to Entities.For more information, see Expressions in LINQ to Entities Queries.

Para obter informações sobre como as chamadas de método do CLR são mapeadas para funções canônicas na fonte de dados, consulte método CLR ao mapeamento canônico de função.For information about how CLR method calls are mapped to canonical functions in the data source, see CLR Method to Canonical Function Mapping.

Para obter informações sobre como chamar canônico, banco de dados e funções personalizadas de dentro do LINQ para consultas de entidades, consulte chamando funções em consultas LINQ to Entities.For information about how to call canonical, database, and custom functions from within LINQ to Entities queries, see Calling Functions in LINQ to Entities Queries.

Execução da ConsultaQuery Execution

Depois que a consulta LINQ é criada pelo usuário, ela é convertida para uma representação que está compatível com o Entity Framework (na forma de árvores de comando), que é, em seguida, executado na fonte de dados.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. No tempo de execução de consulta, todas as expressões de consulta (ou componentes da consulta) são avaliados no cliente ou no servidor.At query execution time, all query expressions (or components of the query) are evaluated on the client or on the server. Isso inclui as expressões que são usadas na materialização de resultados ou projeções de entidade.This includes expressions that are used in result materialization or entity projections. Para obter mais informações, consulte execução de consulta.For more information, see Query Execution. Para obter informações sobre como melhorar o desempenho ao compilar uma consulta uma vez e, em seguida, executá-la várias vezes com parâmetros diferentes, consulte consultas compiladas (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).

MaterializaçãoMaterialization

A materialização é o processo de retornar resultados de consulta de volta para o cliente como tipos CLR.Materialization is the process of returning query results back to the client as CLR types. No LINQ to Entities, os registros de dados dos resultados da consulta nunca são retornados; há sempre um tipo CLR de suporte, definido pelo usuário ou pelo Entity Framework, ou gerado pelo compilador (tipos anônimos).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). Qualquer materialização de objeto é executada pelo Entity Framework.All object materialization is performed by the Entity Framework. Todos os erros que resultarem de uma incapacidade de mapear entre o Entity Framework e o CLR gerarão exceções durante a materialização do objeto.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.

Os resultados da consulta são geralmente retornados como um dos seguintes:Query results are usually returned as one of the following:

  • Uma coleção de zero ou mais objetos de entidade tipados ou uma projeção de tipos complexos definidos no modelo conceitual.A collection of zero or more typed entity objects or a projection of complex types defined in the conceptual model.

  • Tipos CLR que têm suporte pelo Entity FrameworkEntity Framework.CLR types that are supported by the Entity FrameworkEntity Framework.

  • Coleções internas.Inline collections.

  • Tipos anônimos.Anonymous types.

Para obter mais informações, consulte resultados da consulta.For more information, see Query Results.

Nesta seçãoIn This Section

Consultas no LINQ to EntitiesQueries in LINQ to Entities

Expressões em consultas LINQ to EntitiesExpressions in LINQ to Entities Queries

Chamando funções em consultas LINQ to EntitiesCalling Functions in LINQ to Entities Queries

Consultas compiladas (LINQ to Entities)Compiled Queries (LINQ to Entities)

Execução de consultaQuery Execution

Resultados da ConsultaQuery Results

Operadores de consulta padrão em consultas LINQ to EntitiesStandard Query Operators in LINQ to Entities Queries

Método CLR para mapeamento de função canônicaCLR Method to Canonical Function Mapping

Métodos LINQ com e sem suporte (LINQ to Entities)Supported and Unsupported LINQ Methods (LINQ to Entities)

Problemas conhecidos e considerações no LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities

Consulte tambémSee also