LINQ para Entidades

O LINQ to Entities fornece suporte a LINQ (Language-Integrated Query) que permite que os desenvolvedores escrevam consultas no modelo conceitual do Entity Framework usando Visual Basic ou 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 (Language-Integrated Queries) em consultas de árvore de comando, executa as consultas no Entity Framework e retorna objetos que podem ser usados pelo Entity Framework e pelo LINQ. A seguir está o processo para criar e executar uma consulta LINQ to Entities:

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

  2. Componha uma consulta LINQ to Entities em C# ou 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 comandos, em relação à fonte de dados. Quaisquer exceções lançadas na fonte de dados durante a execução são passadas diretamente para o cliente.

  5. Retornar os resultados da consulta ao cliente.

Construindo uma instância de ObjectQuery

A ObjectQuery<T> classe generic 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 generic implementa a IQueryable<T> interface genérica, cujos métodos builder permitem que as consultas LINQ sejam construídas 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 inferência de tipo local habilitada).

Compondo as consultas

As instâncias da ObjectQuery<T> classe genérica, que implementa a interface genérica IQueryable<T> , servem como 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 executa nenhuma ação e não retorna dados; ele apenas armazena as informações da consulta. Depois de criar uma consulta, você deve executá-la para recuperar quaisquer 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. Sintaxe de expressão de consulta e sintaxe de consulta baseada em método são novos em C# 3.0 e Visual Basic 9.0.

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

Conversão de Consultas

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 possa 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 são 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. Este é um superconjunto das expressões permitidas pelo Entity Framework, que são, por definição, restritas a operações permitidas no banco de dados e suportadas pelo ObjectQuery<T>.

No Entity Framework, operadores e expressões são representados por uma única hierarquia de tipo, que é então colocada 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á lançada quando a consulta estiver sendo convertida. A conversão de consultas LINQ para Entidades 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 do 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 momento da tradução da consulta. Para obter uma lista de operadores LINQ to Entities suportados, consulte Métodos LINQ suportados e não suportados (LINQ to Entities).

Para obter mais informações sobre como usar os operadores de consulta padrão no LINQ to Entities, consulte Standard Query Operators in LINQ to Entities Queries.

Em geral, as expressões em LINQ to Entities são avaliadas no servidor, portanto, não se deve esperar que o comportamento da expressão siga 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 do método CLR são mapeadas para funções canônicas na fonte de dados, consulte Método CLR para mapeamento de função canônica.

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 Chamando funções no LINQ to Entities Consultaries.

Execução de Consultas

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 que são usadas na materialização de resultados ou projeções de entidades. 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, em seguida, executando-a várias vezes com parâmetros diferentes, consulte Consultas compiladas (LINQ to Entities).

Materialização

A materialização é o processo de retornar os resultados da consulta ao cliente como tipos CLR. No LINQ to Entities, os registros de dados de resultados de 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). Toda a materialização de objetos é realizada pelo Entity Framework. Quaisquer erros resultantes de uma incapacidade de mapear entre o Entity Framework e o CLR farão com que exceções sejam lançadas 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 de CLR suportados pelo Entity Framework.

  • Coleções em linha.

  • Tipos anônimos.

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

Nesta Secção

Consultas no LINQ to Entities

Expressões em consultas LINQ to Entities

Chamando funções no LINQ para consultas de entidades

Consultas compiladas (LINQ to Entities)

Execução de consultas

Resultados da Consulta

Operadores de consulta padrão em consultas LINQ to Entities

Método CLR para mapeamento de função canônica

Métodos LINQ suportados e não suportados (LINQ to Entities)

Problemas conhecidos e considerações no LINQ to Entities

Consulte também