C# -  A Interface IQueryable


Neste artigo vamos tratar da interface IQueryable na linguagem C#.

O primeiro ponto importante a destacar é que a interface IQueryable herda da interface IEnumerable, de forma que tudo que IEnumerable pode fazer, IQueryable também pode.

Nota: Você pode converter um resultado IQueryable<T> para um List<T> mas normalmente a conversão é feita para um IEnumerable<T>;

Mas existe uma grande diferença...

A interface IQueryable é útil quando você esta consultando uma coleção que foi carregada usando LINQ ou Entity Framework e você quer aplicar um filtro nesta coleção.

Assim, as interfaces IQueryable e IQueryable<T> permitem aos desenvolvedores traduzir uma consulta LINQ  em uma fonte de dados específica, por exemplo, um banco de dados relacional.

Então se você esta trabalhando somente com coleção de dados em memória a interface IEnumerable é uma boa escolha, mas se você precisa consultar uma coleção de dados que esta conectada a um banco de dados, usar IQueryable é a melhor escolha, pois ela reduz o tráfego de rede e usa a linguagem SQL.

Veja esta consulta LINQ:

var consulta = from livro in livros
                      where livro.Autor == "Paulo Coelho"
                      select livro;


Se a variável livros for de  um tipo que implemente IQueryable<Livro>, a consulta acima será passada para o provedor na forma de uma árvore de expressão, uma estrutura de dados que reflete a estrutura do código.

O provedor pode inspecionar a árvore de expressão em tempo de execução para determinar:

  1. Que existe um predicado para a propriedade Autor da classe Livro;

  2. Que o método de comparação usado é 'igual' (==);

  3. Que o valor que deve ser igual é "Paulo Coelho";

Com essas informações, o provedor pode converter a consulta C# em uma consulta SQL em tempo de execução e passar essa consulta para um banco de dados relacional para buscar apenas os livros que correspondem ao predicado, gerando uma consulta assim :

SELECT *
FROM Livros
WHERE Autor = 'Paulo Coelho"

Neste caso o filtro é aplicado no banco de dados usando a consulta SQL; de forma que o cliente envia uma solicitação ao servidor e uma consulta Select é disparada no banco de dados e somente os dados necessários são retornados:

Você esta gerando uma consulta e não um resultado final. Este resultado filtrado pode depois ser analisado de forma mais detalhada.

Assim o provedor é chamado quando a variável consulta for iterada (IQueryable implementa IEnumerable) usando um ToList, foreach, etc.

Simples assim...

Para saber mais sobre árvores de expressão ou Expression Trees veja o artigo : C# - Apresentando Expression Trees - Macoratti

"Tendo sido, pois, justificados pela fé, temos paz com Deus, por nosso Senhor Jesus Cristo;
Pelo qual também temos entrada pela fé a esta graça, na qual estamos firmes, e nos gloriamos na esperança da glória de Deus."

Romanos 5:1,2

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti