Otimize a paginação e classificação com ObjectDataSource com EnableCaching = true

Estou usando um backup de ODS (ObjectDataSource) com uma classe Linq-To-SQL para preencher o GridView na minha página.

Considerando o desempenho - desabilitei o Viewstate do GridView e habilitei o cache no ODS.

Além disso, também otimizei o método Search na classe Linq-to-SQL para usar os métodos .skip & .take para buscar apenas uma 'página cheia' de registros.

Agora, o problema é que, devido ao armazenamento em cache, o ODS não pode 'classificar' o registro definido por si próprio. Conforme detalhado neste tópico:

A classificação do GridView não funciona quando eu Ativo o Armazenamento em Cache na Paginação e Classificação Custome

As pessoas recomendam usar a classificação personalizada e implementar o 'Comparer', mas acredito que isso arruina meus benefícios de desempenho.

http://forums.asp.net/t/1344883.aspx

Estou pronto para fazer uma viagem ao banco de dados durante a classificação, mas como separá-lo quando o Caching está ativado?

FYI, eu já tenho um painel de atualização AJAX no qual tenho este GridView (EnableViewstate = false) e ODS (EnableCaching = true). Espero que eu esteja no caminho certo ... sugestões são apreciadas.

Eu tenho que executar a classificação no lado do aplicativo usando a 'Classificação personalizada' (que é adicionar métodos extras para permitir a classificação em uma coleção genérica de objetos). Essa solução não era aceitável porque exigia que eu puxasse TODOS os registros do banco de dados e, em seguida, execute a classificação neles!

Em primeiro lugar, não acredito que o aplicativo possa fazer uma classificação melhor / mais rápida que o DB. Em segundo lugar - isso arruina todo o benefício de desempenho que estou recebendo devido à paginação otimizada - estou usando os métodos LINQ .skip () e .take () para buscar apenas uma 'página' de registros.

Bem, finalmente tive que inventar uma correção minha. Pode ser limitado ao meu tipo de cenário, mas com certeza é muito mais fácil e também preserva a otimização da paginação e do cache de dados.

MINHA SOLUÇÃO: Toquei no evento 'Classificação' do Gridview. O erro 'classificação personalizada' é acionado se eu permitir que o ODS tente fazer a classificação por conta própria nos dados em cache. Em vez disso, agora faço a classificação manualmente e cancelo o evento de classificação.Para isso - só preciso explicitar o parâmetro 'orderBy' no ODS e defini-lo como a nova expressão de classificação no evento 'Sorting' do Gridview. Isso atualizará a grade e, no final, eu faço:

odsOrganization.SelectParameters["orderBy"].DefaultValue = GetSortExpr(e.SortExpression);
...
e.Cancel = true;

isso diz ao ODS para cancelar a classificação (que eu já realizei antes de cancelar o evento - como acima). É como se eu estivesse enganando o ODS e lidando com a classificação em segundo plano. E graças ao ODS, ele sente que o 'SelectParameters ["orderBy"]' mudou e executa uma seleção novamente. I A classificação anterior é automaticamente armazenada em 'odsOrganization.SelectParameters ["orderBy"]. DefaultValue' que eu posso usar nas iterações subseqüentes.

Ainda estou testando este, mas é incrível que, apenas atualizando o DefaultValue ODS do parâmetro, volte para buscar os dados. Isso preserva o cache até que o usuário execute a classificação (ele pega os dados do cache para outras operações) e volta ao banco de dados para classificar. Espero que funcione para mim!

questionAnswers(1)

yourAnswerToTheQuestion