Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Language-Integrated Query (LINQ) é o nome de um conjunto de tecnologias baseadas na integração de recursos de consulta diretamente na linguagem C#. Tradicionalmente, as consultas em relação aos dados são expressas como cadeias de caracteres simples sem verificação de tipo em tempo de compilação ou suporte ao IntelliSense. Além disso, você precisa aprender uma linguagem de consulta diferente para cada tipo de fonte de dados: bancos de dados SQL, documentos XML, vários serviços da Web e assim por diante. Com o LINQ, uma consulta é uma construção de linguagem de primeira classe, assim como classes, métodos e eventos.
Quando você escreve consultas, a parte "integrada à linguagem" mais visível do LINQ é a expressão de consulta. As expressões de consulta são escritas em uma sintaxe de consulta declarativa. Usando a sintaxe de consulta, você executa operações de filtragem, ordenação e agrupamento em fontes de dados com um mínimo de código. Você usa os mesmos padrões de expressão de consulta para consultar e transformar dados de qualquer tipo de fonte de dados.
O exemplo a seguir mostra uma operação de consulta completa. A operação completa inclui a criação de uma fonte de dados, a definição da expressão de consulta e a execução da consulta em uma foreach
instrução.
// Specify the data source.
int[] scores = [97, 92, 81, 60];
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (var i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Talvez seja necessário adicionar uma using
diretiva, using System.Linq;
, para compilar o exemplo anterior. As versões mais recentes do .NET fazem uso de usos implícitos para adicionar esta diretiva como um uso global. As versões mais antigas exigem que você o adicione à sua fonte.
Visão geral da expressão de consulta
- As expressões de consulta consultam e transformam dados de qualquer fonte de dados habilitada para LINQ. Por exemplo, uma única consulta pode recuperar dados de um banco de dados SQL e produzir um fluxo XML como saída.
- As expressões de consulta usam muitas construções familiares da linguagem C#, o que as torna fáceis de ler.
- As variáveis numa expressão de consulta são todas fortemente tipadas.
- Uma consulta não é executada até que se itere sobre a variável de consulta, por exemplo, numa
foreach
instrução. - Em tempo de compilação, as expressões de consulta são convertidas em chamadas de método de operador de consulta padrão de acordo com as regras definidas na especificação C#. Qualquer consulta que possa ser expressa usando sintaxe de consulta também pode ser expressa usando sintaxe de método. Em alguns casos, a sintaxe da consulta é mais legível e concisa. Em outros, a sintaxe do método é mais legível. Não há diferença semântica ou de desempenho entre as duas formas diferentes. Para obter mais informações, consulte Especificação da linguagem C# e Visão geral dos operadores de consulta padrão.
- Algumas operações de consulta, como Count ou Max, não têm cláusula de expressão de consulta equivalente e, portanto, devem ser expressas como uma chamada de método. A sintaxe do método pode ser combinada com a sintaxe de consulta de várias maneiras.
- As expressões de consulta podem ser compiladas para árvores de expressão ou para delegados, dependendo do tipo ao qual a consulta é aplicada. IEnumerable<T> As consultas são compiladas para delegados. IQueryable e IQueryable<T> consultas são compiladas em árvores de expressão. Para obter mais informações, consulte Árvores de expressão.
Como habilitar a consulta LINQ da sua fonte de dados
Dados na memória
Há duas maneiras de habilitar a consulta LINQ de dados na memória. Se os dados forem de um tipo que implementa IEnumerable<T>, você consulta os dados usando LINQ to Objects. Se não fizer sentido habilitar a enumeração implementando a IEnumerable<T> interface, você definirá métodos de operador de consulta padrão LINQ, nesse tipo ou como métodos de extensão para esse tipo. As implementações personalizadas dos operadores de consulta padrão devem usar a execução adiada para retornar os resultados.
Dados remotos
A melhor opção para habilitar a consulta LINQ de uma fonte de dados remota é implementar a IQueryable<T> interface.
Provedores LINQ IQueryable
Os provedores LINQ que implementam IQueryable<T> podem variar muito em sua complexidade.
Um provedor menos complexo IQueryable
pode acessar um único método de um serviço Web. Esse tipo de provedor é muito específico porque espera informações específicas nas consultas que trata. Tem um sistema de tipo fechado, talvez expondo um único tipo de resultado. A maior parte da execução da consulta ocorre localmente, por exemplo, usando as Enumerable implementações dos operadores de consulta padrão. Um provedor menos complexo pode examinar apenas uma expressão de chamada de método na árvore de expressões que representa a consulta e permitir que a lógica restante da consulta seja manipulada em outro lugar.
Um IQueryable
provedor de média complexidade pode ter como alvo uma fonte de dados que tenha uma linguagem de consulta parcialmente expressiva. Se tiver como alvo um serviço Web, pode aceder a mais de um método do serviço Web e selecionar qual método chamar com base nas informações que a consulta procura. Um provedor de média complexidade teria um sistema de tipo mais rico do que um provedor simples, mas ainda seria um sistema de tipo fixo. Por exemplo, o provedor pode expor tipos que possuem relações um-para-muitos que podem ser percorridas, mas não disponibilizaria tecnologia de mapeamento para tipos personalizados pelo utilizador.
Um provedor complexo IQueryable
, como o provedor Entity Framework Core , pode traduzir consultas LINQ completas para uma linguagem de consulta expressiva, como SQL. Um provedor complexo é mais geral porque pode lidar com uma variedade maior de perguntas na consulta. Ele também tem um sistema de tipo aberto e, portanto, deve conter extensa infraestrutura para mapear tipos definidos pelo usuário. Desenvolver um fornecedor complexo requer uma quantidade significativa de esforço.