Compartilhar via


LINQ to Entities

O LINQ to Entities fornece suporte Language-Integrated Query (LINQ) que permite que os desenvolvedores escrevam consultas no modelo conceitual do Entity Framework usando o Visual Basic ou o Visual C#. As consultas no Entity Framework são representadas por consultas de árvore de comando, que são executadas no contexto do objeto. O LINQ to Entities converte consultas LINQ (consultas Language-Integrated) em consultas de árvore de comando, executa as consultas no Entity Framework e retorna objetos que podem ser usados pela Estrutura de Entidade e pelo LINQ. Este é o processo para criar e executar uma consulta LINQ to Entities:

  1. Construir uma ObjectQuery<T> instância a partir de ObjectContext.

  2. Redigir uma consulta LINQ to Entities no C# ou no Visual Basic usando a ObjectQuery<T> instância.

  3. Converta operadores e expressões de consulta padrão LINQ em árvores de comando.

  4. Execute a consulta, na representação da árvore de comando, na fonte de dados. Todas as exceções geradas na fonte de dados durante a execução são passadas diretamente para o cliente.

  5. Retorne os resultados da consulta de volta ao cliente.

Construindo uma instância objectQuery

A ObjectQuery<T> classe genérica representa uma consulta que retorna uma coleção de zero ou mais entidades tipadas. Uma consulta de objeto normalmente é construída a partir de um contexto de objeto existente, em vez de ser construída manualmente e sempre pertence a esse contexto de objeto. Esse contexto fornece as informações de conexão e metadados necessárias para compor e executar a consulta. A ObjectQuery<T> classe genérica implementa a IQueryable<T> interface genérica, cujos métodos de construtor permitem que as consultas LINQ sejam criadas incrementalmente. Você também pode permitir que o compilador infera o tipo de entidades usando a palavra-chave C# var (Dim no Visual Basic, com a inferência de tipo local habilitada).

Compondo as consultas

Instâncias da ObjectQuery<T> classe genérica, que implementa a interface genérica IQueryable<T> , servem como a fonte de dados para consultas LINQ to Entities. Em uma consulta, você especifica exatamente as informações que deseja recuperar da fonte de dados. Uma consulta também pode especificar como essas informações devem ser classificadas, agrupadas e moldadas antes de serem retornadas. No LINQ, uma consulta é armazenada em uma variável. Essa variável de consulta não toma nenhuma ação e não retorna dados; ele armazena apenas as informações de consulta. Depois de criar uma consulta, você deve executar essa consulta para recuperar os dados.

As consultas LINQ to Entities podem ser compostas em duas sintaxes diferentes: sintaxe de expressão de consulta e sintaxe de consulta baseada em método. A sintaxe da expressão de consulta e a sintaxe de consulta baseada em método são novas no C# 3.0 e no Visual Basic 9.0.

Para obter mais informações, consulte Consultas no LINQ to Entities.

Conversão de consulta

Para executar uma consulta LINQ to Entities no Entity Framework, a consulta LINQ deve ser convertida em uma representação de árvore de comandos que pode ser executada no Entity Framework.

As consultas LINQ to Entities são compostas por operadores de consulta padrão LINQ (como Select, Wheree GroupBy) e expressões (x > 10, Contact.LastName e assim por diante). Os operadores LINQ não são definidos por uma classe, mas sim métodos em uma classe. No LINQ, as expressões podem conter qualquer coisa permitida por tipos dentro do System.Linq.Expressions namespace e, por extensão, qualquer coisa que possa ser representada em uma função lambda. Esse é um superconjunto das expressões permitidas pelo Entity Framework, que são, por definição, restritas às operações permitidas no banco de dados e compatíveis com ObjectQuery<T>.

No Entity Framework, operadores e expressões são representados por uma hierarquia de tipo único, que são então colocadas em uma árvore de comandos. A árvore de comandos é usada pelo Entity Framework para executar a consulta. Se a consulta LINQ não puder ser expressa como uma árvore de comandos, uma exceção será gerada quando a consulta estiver sendo convertida. A conversão de consultas do LINQ to Entities envolve duas subconversões: a conversão dos operadores de consulta padrão e a conversão das expressões.

Há vários operadores de consulta padrão LINQ que não têm uma tradução válida no LINQ to Entities. As tentativas de usar esses operadores resultarão em uma exceção no tempo de tradução da consulta. Para obter uma lista de operadores LINQ to Entities com suporte, consulte Métodos LINQ compatíveis e sem suporte (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 no LINQ to Entities Queries.

Em geral, as expressões em LINQ to Entities são avaliadas no servidor, portanto, o comportamento da expressão não deve ser esperado para seguir a semântica CLR. Para obter mais informações, consulte Expressões em consultas LINQ to Entities.

Para obter informações sobre como as chamadas de método CLR são mapeadas para funções canônicas na fonte de dados, consulte o Método CLR para o Mapeamento de Funções Canônicas.

Para obter informações sobre como chamar funções canônicas, de banco de dados e personalizadas de dentro das consultas LINQ to Entities, consulte As funções de chamada no LINQ para consultas de entidades.

Execução da consulta

Depois que a consulta LINQ é criada pelo usuário, ela é convertida em uma representação compatível com o Entity Framework (na forma de árvores de comando), que é executada na fonte de dados. No momento da execução da consulta, todas as expressões de consulta (ou componentes da consulta) são avaliadas no cliente ou no servidor. Isso inclui expressões usadas em projeções de entidade ou materialização de resultados. Para obter mais informações, consulte Execução de Consulta. Para obter informações sobre como melhorar o desempenho compilando uma consulta uma vez e executando-a várias vezes com parâmetros diferentes, consulte Consultas Compiladas (LINQ to Entities).

Materialização

Materialização é o processo de retorno dos resultados de consulta ao cliente em tipos CLR. No LINQ to Entities, os registros de dados de resultados da consulta nunca são retornados; há sempre um tipo CLR de backup, definido pelo usuário ou pelo Entity Framework ou gerado pelo compilador (tipos anônimos). Toda a materialização de objeto é executada pelo 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.

Os resultados da consulta geralmente são retornados como um dos seguintes:

  • Uma coleção de zero ou mais objetos de entidade tipados ou uma projeção de tipos complexos definidos no modelo conceitual.

  • Tipos CLR compatíveis com o Entity Framework.

  • Coleções internas.

  • Tipos anônimos.

Para obter mais informações, consulte Resultados da Consulta.

Nesta seção

Consultas em LINQ to Entities

Expressões em consultas no LINQ to Entities

Chamar o Functions em consultas no LINQ to Entities

Consultas compiladas (LINQ to Entities)

Execução de consulta

Resultados da Consulta

Operadores de consulta padrão em consultas LINQ to Entities

Método CLR para mapeamento de funções canônicas

Métodos LINQ com suporte e sem suporte (LINQ to Entities)

Problemas e considerações conhecidos no LINQ to Entities

Consulte também