2009-07-09 21 views
13

La mayoría de las soluciones de paginación ASP.NET MVC que he encontrado al buscar en Google parecen obtener todas las filas de una tabla de base de datos en forma de una colección IEnumerable, realizar una conversión de paginación en la colección IEnumerable y luego devolver los resultados al ver. Quiero poder hacer una página en el lado de la base de datos pero todavía tengo alguna clase de paginación para hacer los cálculos del número de página y la generación de HTML. ¿Hay alguna solución que haga esto? ¿O son los que he estado viendo hacer esto, pero no lo estoy viendo porque los estoy viendo mal?¿Hay una solución de paginación para ASP.NET MVC que realiza paginación en la base de datos?

Esto es lo que he estado buscando en:

+0

Esto realmente no tiene nada que ver con ASP.NET MVC ... –

+0

está en lo cierto, pero yo no Lo sé hasta después de las respuestas de jvanderh y Craig. perdón por cualquier confusión. – gabe

Respuesta

14

Mire la muestra de Gu's Nerdinner.

var upcomingDinners = dinnerRepository.FindUpcomingDinners(); 
var paginatedDinners = upcomingDinners.Skip(10).Take(20).ToList(); 

Aunque FindUpcomingDinners() obtiene todos los próximos cenas, la consulta no se ejecuta en la base de datos hasta que llame ToList() en la línea siguiente. Y eso es después de usted Omita 10 filas y obtenga
el próximo 20.

+0

lo verificare en la muestra. ah, ya veo. ¡Tu última oración me iluminó mucho! ¡mucho! – gabe

+0

Le recomiendo que revise toda la muestra, pero el enlace que proporcioné es el capítulo que explica con más detalle cómo funciona IQueryable. – jvanderh

+0

estoy haciendo eso mientras comentamos – gabe

5

Estás equivocado. PagedList lo hará en el servidor de bases de datos, ya que tiene extensiones IQueryable.

+0

entonces, ¿cuál sería la sintaxis de la acción del controlador? todo lo que he visto hace algo como productRepository.GetAllProducts(). ToPagedList (pageIndex, pageSize). – gabe

+1

Sí, eso es lo correcto. Esto convierte ** la página seleccionada solamente ** en IEnumerable. La búsqueda se realiza en el servidor de bases de datos a través de IQueryable. Lo mismo para el conde. –

+1

mi problema era que no sabía lo que hacía IQueryable (es decir, "ejecución diferida"). sus comentarios, así como los demás, me señalaron en la dirección correcta para su comprensión. ¡Gracias! – gabe

3

ScottGu tiene una muy buena serie de blog de varias partes sobre el uso de LINQ en Asp.Net (incluido MVC). Recomiendo leer toda la serie comenzando en la Parte 1, pero Part 3 cubre, de hecho, lo que está buscando: la sección titulada "Localizar nuestros resultados de la consulta" se refiere específicamente a la búsqueda en la base de datos.

2

¿No sería más eficiente implementar un procedimiento almacenado que tenga los parámetros @StartPage y @PageSize?

esta manera sólo se está recuperando el subconjunto de datos que se está utilizando realmente

sólo tienen un parámetro de salida llamado totalCount o algo similar para que sepa el número de enlaces página para crear y cada evento onclick enlace pasará el número de página a una función javascript que forma asíncrona se carga el div u otro elemento HTML con más datos

fáciles

+0

LINQ hace lo mismo con Skip() y Take(). Si se accede a sus datos por una multitud de aplicaciones, entonces supongo que un procedimiento almacenado es una buena idea. De lo contrario, LINQ es mucho más fácil de implementar, leer y depurar. – jrjensen