Partilhar via


Habilitando uma fonte de dados para consultas LINQ (Visual Basic)

Há várias maneiras 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, para citar alguns. O padrão LINQ torna mais 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 da consulta não são alterados. As maneiras pelas quais o LINQ pode ser estendido a essas fontes de dados incluem o seguinte:

  • Implementando a interface em um tipo para habilitar a IEnumerable<T> consulta 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 a consulta LINQ personalizada desse tipo.

  • Criação de um provedor para sua fonte de dados que implementa a IQueryable<T> interface. Um provedor que implementa essa interface recebe consultas LINQ na forma de árvores de expressão, que podem ser executadas de forma personalizada, por exemplo, remotamente.

  • Criar um provedor para sua fonte de dados que aproveite uma tecnologia LINQ existente. Esse provedor permitiria não apenas consultar, mas também inserir, atualizar e excluir operações e mapeamento para tipos definidos pelo usuário.

Este tópico discute essas opções.

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ê pode consultar os dados usando LINQ to Objects. Se não fizer sentido habilitar a enumeração do seu tipo implementando a IEnumerable<T> interface, 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 estendam 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 a consulta LINQ de uma fonte de dados remota é implementar a IQueryable<T> interface. No entanto, isso difere de estender um provedor como LINQ to SQL para uma fonte de dados. Nenhum modelo de provedor para estender tecnologias LINQ existentes, como LINQ to SQL, para outros tipos de fonte de dados está disponível no Visual Studio 2008.

IQueryable LINQ Fornecedores

Os provedores LINQ que implementam IQueryable<T> podem variar muito em sua complexidade. Esta seção discute os diferentes níveis de complexidade.

Um provedor menos complexo IQueryable pode interagir com 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 ele se destinar a um serviço Web, ele pode interagir com mais de um método do serviço Web e selecionar o método a ser chamado com base na pergunta que a consulta coloca. 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 têm relações um-para-muitos que podem ser percorridas, mas não forneceria tecnologia de mapeamento para tipos definidos pelo usuário.

Um provedor complexo IQueryable , como o provedor LINQ to SQL, pode traduzir consultas LINQ completas para uma linguagem de consulta expressiva, como SQL. Um provedor complexo é mais geral do que um provedor menos complexo, 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.

Consulte também