Compartilhar via


Habilitando uma fonte de dados para consulta 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 facilita a consulta de uma fonte de dados para a qual a consulta LINQ está habilitada, pois a sintaxe e o padrão da consulta não são alterados. As maneiras pelas quais o LINQ pode ser estendido para essas fontes de dados incluem o seguinte:

  • Implementação da interface IEnumerable<T> em um tipo para habilitar consultas LINQ to Objects desse tipo.

  • Criando métodos de operador de consulta padrão, como Where e Select que estendem um tipo, para habilitar a consulta LINQ personalizada desse tipo.

  • Criando 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 maneira personalizada, por exemplo, remotamente.

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

Este tópico discute essas opções.

Como habilitar a consulta LINQ de sua fonte de dados

Dados do In-Memory

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ê poderá 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 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 a consulta LINQ de uma fonte de dados remota é implementar a IQueryable<T> interface. No entanto, isso difere de extender um provedor como o LINQ to SQL para uma fonte de dados. Nenhum modelo de provedor para estender tecnologias LINQ existentes, como LINQ para SQL, para outros tipos de fonte de dados estão disponíveis no Visual Studio 2008.

Provedores IQueryable de LINQ

Os provedores LINQ que implementam IQueryable<T> podem variar amplamente 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 ele manipula. Ele 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ão que representa a consulta e permitir que a lógica restante da consulta seja tratada em outro lugar.

Um IQueryable provedor de complexidade média pode ter como alvo uma fonte de dados que tenha uma linguagem de consulta parcialmente expressiva. Se ele for direcionado a um serviço web, ele poderá interagir com mais de um método do serviço web e selecionar o método a ser chamado com base na pergunta feita pela consulta. Um provedor de complexidade média 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 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 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, pois pode lidar com uma variedade maior de perguntas na consulta. Ele também tem um sistema de tipo aberto e, portanto, deve conter uma infraestrutura extensa para mapear tipos definidos pelo usuário. O desenvolvimento de um provedor complexo requer uma quantidade significativa de esforço.

Consulte também