Habilitar uma Fonte de Dados para Consulta LINQ (Visual Basic)

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 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<T> em um tipo para habilitar consultas LINQ to Objects desse tipo.

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

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

  • Criar 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 de habilitar consultas LINQ para dados na memória. Se os dados forem de um tipo que implemente IEnumerable<T>, você poderá consultar os dados usando o LINQ to Objects. Se não fizer sentido habilitar a enumeração do tipo por meio da implementação da interface IEnumerable<T>, você poderá definir métodos de operador de consulta padrão LINQ nesse tipo ou criar métodos de operador de consulta padrão LINQ que 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 LINQ de uma fonte de dados remota é implementar a interface IQueryable<T>. 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 fonte de dados está disponível no Visual Studio 2008.

Provedores IQueryable de LINQ

Os provedores LINQ que implementam IQueryable<T> 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 IQueryable complexo, como o provedor LINQ to SQL, poderia traduzir consultas LINQ completas 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.

Confira também