Paginação utilizando LINQ

by Israel Aece 16. February 2009 14:52

Podemos facilmente vincular uma query LINQ em um controle DataBound do ASP.NET para exibir os dados. A query pode ser feita utilizando LINQ To SQL, LINQ To Xml, etc. Com isso, podemos simplesmente fazer:

this.GridView1.DataSource = from cliente in colecaoDeClientes select cliente;
this.GridView1.DataBind();

Os problemas aparecem quando voce habilita a paginação do controle e, ao rodar o mesmo exemplo, uma exceção do tipo NotSupportedException será disparada, informando a seguinte mensagem: The data source does not support server-side data paging. Quando efetuamos uma query LINQ (em cima de qualquer fonte de informação), o retorno é sempre uma classe que implementa direta ou indiretamente a Interface IEnumerable<T>, e para efetuar a paginação, é necessário que o controle conheça a quantidade de registros retornados pela query para conseguir dimensionar a quantidade necessária de páginas a serem exibidas.

A Interface referida acima não possui uma propriedade que informe a quantidade de elementos da coleção e, como alternativa, podemos alterar a query para que ela retorne uma instancia da classe List<T>, modificando ligeiramente a query:

this.GridView1.DataSource = (from cliente in colecaoDeClientes select cliente).ToList();
this.GridView1.DataBind();

Tags: ,

ASP.NET | Data

Comments

6/25/2009 6:20:56 PM #

Tarcísio

Esse tipo de paginação é eficente? Por exemplo se eu tenho um table com 50.000 registros e fizer um select que vai retorar todos os registros essa paginação ela vai trazer todos os 50.000 registro no objeto certo?

Tarcísio Brazil

6/26/2009 8:01:33 AM #

IsraelAece

Boas Tarcisio,

Sim, para melhor performance, o ideal é "fatiar" o result-set.

A idéia do post foi somente para mostrar o "problema" que existe ao utilização a paginação com uma query LINQ.

IsraelAece Brazil

4/5/2010 11:22:07 PM #

Bruno Salvino

Mas invocando o método .ToList() desta forma, não perco a funcionalidade de deferred executiondo LINQ? Os exemplos que costumeiramente vejo, utilizam .Skip() e .Take() para realizar a paginação.

Bruno Salvino Brazil

4/6/2010 7:11:29 AM #

IsraelAece

Boas Bruno,

O post originou em um cenário específico, onde estava exatamente o que mostrei aí, ou seja, o vinculado direto da query na propriedade DataSource de um controle DataBound. Naquele caso específico, ela precisava da massa de dados (que não era grande) para fazer algumas manipulações antes de exibí-la.

Mas no geral, o ideal é mesmo efetuar a paginação do lado do servidor, utilizando os métodos Skip e Take para "fatiar" o result-set diretamente no banco de dados, ao invés de trazer tudo isso para a aplicação.

IsraelAece Brazil

Comments are closed

Powered by BlogEngine.NET 1.5.0.0
Theme by Mads Kristensen

Sobre

Meu nome é Israel Aece e sou especialista em tecnologias de desenvolvimento Microsoft, atuando como desenvolvedor de aplicações para o mercado financeiro utilizando a plataforma .NET. [ Mais ]

Twitter

Host