Compartilhar via


Habilitando uma fonte de dados para consulta LINQ

Há várias formas de estender o LINQ para permitir que qualquer fonte de dados seja consultada no padrão LINQ. A fonte de dados pode ser uma estrutura de dados, um serviço Web, um sistema de arquivos ou um banco de dados, apenas para citar algumas opções. O padrão LINQ torna fácil para os clientes consultarem uma fonte de dados para a qual a consulta do LINQ está habilitada, porque a sintaxe e o padrão de consulta não mudam. As formas nas quais o LINQ pode ser estendido para essas fontes de dados incluem as seguintes:

  • Implementação da interface IEnumerable em um tipo para habilitar consultas desse tipo do LINQ para Objetos.

  • Criação de métodos de operador de consulta padrão, como Where e Select que estendem um tipo, para habilitar consultas personalizadas de LINQ desse tipo.

  • Criação de um provedor para sua fonte de dados que implemente a interface IQueryable. Um provedor que implementa a interface recebe consultas de LINQ na forma de árvores de expressões, as quais ele pode executar de forma personalizada, por exemplo, remotamente.

  • A criação de um provedor para sua fonte de dados que se beneficia de uma tecnologia existente do LINQ. Tal provedor habilitaria não apenas a consulta, mas também operações de inserção, atualização e exclusão e mapeamento para tipos definidos pelo usuário.

Este tópico aborda essas opções.

Como habilitar consultas de LINQ da sua fonte de dados

Dados na memória

Há duas formas como você pode habilitar consultas do LINQ para dados na memória. Se os dados forem de um tipo que implemente IEnumerable, você poderá consultar os dados usando o LINQ para Objetos. Se não fizer sentido habilitar a enumeração do tipo por meio da implementação da interface IEnumerable, você poderá definir métodos de operador de consulta padrão do LINQ nesse tipo ou criar métodos de operador de consulta padrão do LINQque estendem o 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 consultas do LINQ de uma fonte de dados remota é implementar a interface IQueryable. No entanto, isso é diferente de estender um provedor como o LINQ to SQL para uma fonte de dados. Nenhum modelo de provedor para estender as tecnologias LINQ existentes, como o LINQ to SQL, para outros tipos de fontes de dados está disponível no Visual Studio 2008.

Provedores IQueryable de LINQ

Os provedores de LINQ que implementam IQueryable podem variar enormemente em termos de complexidade. Esta seção discute os diferentes níveis de complexidade.

Um provedor menos complexo de IQueryable poderia fazer a interface com um único método de um serviço Web. Esse tipo de provedor é muito específico porque ele espera informações específicas nas consultas que manipula. Ele possui um sistema de tipos fechado, talvez expondo um único tipo de resultado. A maior parte da execução da consulta ocorre localmente, por exemplo, usando as implementações de Enumerable dos operadores de consulta padrão. Um provedor menos complexo poderia examinar somente uma expressão de chamada do método na árvore de expressões que representa a consulta e deixar que a lógica restante da consulta fosse manipulada em outro lugar.

Um provedor de IQueryable de complexidade média pode destinar uma fonte de dados que tem uma linguagem de consulta parcialmente expressiva. Se o destino é um serviço Web, ele pode fazer a interface com mais de um método de serviço Web e selecionar o método a ser chamado com base na questão representada pela consulta. Um provedor de complexidade média teria um sistema de tipos maiores do que um provedor simples, mas continuaria a ser um sistema de tipo fixo. Por exemplo, o provedor pode expor os tipos que têm relação um para muitos que podem ser atravessados, mas não forneceria tecnologia de mapeamento de tipos definidos pelo usuário.

Um provedor complexo de IQueryable, como o provedor de LINQ to SQL, poderia traduzir consultas completas de LINQ para uma linguagem de consultas expressiva, como SQL. Um provedor complexo é mais geral do que um provedor menos complexo porque pode manipular uma variedade mais ampla de perguntas na consulta. Ele também possui um sistema de tipos abertos e, consequentemente, deve conter uma infraestrutura extensiva para mapear tipos definidos pelo usuário. Desenvolver um provedor complexo requer uma quantidade significativa de esforço.

Para obter mais informações sobre como criar seu próprio provedor de LINQ, consulte as entradas de blog LINQ: Criando um provedor IQueryable e Link para todos: Uma lista de provedores de LINQ no MSDN.

Consulte também

Referência

IQueryable

IEnumerable

Enumerable

Conceitos

Visão geral de operadores de consulta padrão

Objetos LINQ to

Outros recursos

LINQ: Criando um provedor IQueryable

Link para todos: Uma lista de provedores de LINQ