Optimice la paginación y la ordenación con ObjectDataSource con EnableCaching = true

Estoy usando un ODS (ObjectDataSource) respaldado con una clase Linq-To-SQL para llenar Gridview en mi página.

Teniendo en cuenta el rendimiento: he desactivado el Viewstate de Gridview y habilitado el almacenamiento en caché en el ODS.

Además de esto, también he optimizado el método de búsqueda en la clase Linq-to-SQL para usar los métodos .skip y .take para obtener solo un 'pageful' de registros.

Ahora, el problema es que debido al almacenamiento en caché, el ODS no puede 'ordenar' el conjunto de registros por sí solo. Como se detalla en este hilo:

La ordenación de GridView no funciona cuando habilito el almacenamiento en caché en Custome Paging y la ordenación

La gente recomienda usar una clasificación personalizada e implementar 'Comparer', pero creo que esto arruina mis beneficios de rendimiento.

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

Estoy listo para hacer un viaje DB mientras clasifico, pero ¿cómo separarlo cuando el almacenamiento en caché está activado?

Para su información, ya tengo un panel de actualización AJAX en el que tengo este Gridview (EnableViewstate = false) y ODS (EnableCaching = true). Espero estar en el camino correcto ... se agradecen las sugerencias.

Tengo que realizar la ordenación en el lado de la aplicación usando 'Custom-sort' (es decir, agregar métodos adicionales para habilitar la clasificación en una colección genérica de objetos). ¡Esta solución no era aceptable porque exigía que extrajera TODOS los registros del DB y luego los ordenara!

En primer lugar, no creo que la aplicación pueda hacer una clasificación mejor / más rápida que DB. Y en segundo lugar, esto arruina todo el beneficio de rendimiento que obtengo debido a la paginación optimizada, estoy usando los métodos LINK .skip () y .take () para obtener solo un 'pageful' de registros.

Bueno, finalmente tuve que inventar una solución propia. Puede estar limitado a mi tipo de escenario, pero seguramente es mucho más fácil y también preserva la optimización de la paginación y el almacenamiento en caché de datos.

MI SOLUCIÓN: He tocado el evento 'Ordenar' de Gridview. El error de 'clasificación personalizada' se activa si permito que el ODS intente hacer la clasificación por sí solo en los datos almacenados en caché. En lugar de eso, ahora realizo la clasificación manualmente y cancelo el evento de clasificación.Para esto, solo tengo que hacer explícito el parámetro 'orderBy' en ODS y establecerlo en la nueva expresión de clasificación en el evento 'Ordenar' de Gridview. Esto actualizará la cuadrícula y al final lo hago:

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

esto le dice al ODS que cancele la clasificación (que ya realicé antes de cancelar el evento, como se indicó anteriormente). Es como si estuviera engañando a las SAO y manejando la clasificación en segundo plano. Y gracias a ODS, siente que el 'SelectParameters ["orderBy"]' ha cambiado y realiza una selección una vez más. I La clasificación anterior se almacena automáticamente en 'odsOrganization.SelectParameters ["orderBy"]. DefaultValue' que puedo usar en iteraciones subsecuentes.

Todavía estoy probando este, pero es sorprendente que solo actualizando el valor predeterminado del parámetro ODS vuelva a buscar los datos. Esto conserva la memoria caché hasta que el usuario realiza la ordenación (toma datos de la memoria caché para otras operaciones) y vuelve a la base de datos para ordenar. ¡Espero que funcione para mí!

Respuestas a la pregunta(1)

Su respuesta a la pregunta