2009-07-09 6 views
13

La maggior parte delle soluzioni di paging ASP.NET MVC che ho trovato su google ha l'aspetto di ottenere tutte le righe da una tabella di database sotto forma di una raccolta IEnumerable, eseguire una conversione di paging nella raccolta IEnumerable e quindi restituire i risultati alla vista. Voglio essere in grado di pagina sul lato DB, ma ho ancora qualche classe di paging per fare i calcoli del numero di pagina e la generazione di HTML. C'è una soluzione là fuori che fa questo? O sono quelli che ho visto fare questo, ma non lo vedo perché li sto guardando male?Esiste una soluzione di paging per ASP.NET MVC che esegue il paging nel database?

qui è quello che ho cercato in:

+0

Questo in realtà non ha nulla a che fare con ASP.NET MVC ... –

+0

lei ha ragione, ma io didn lo sappiamo fino a dopo le risposte di jvanderh e Craig. mi dispiace per ogni confusione. – gabe

risposta

14

Esaminare l'esempio Nerdinner del Gu.

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

Anche se FindUpcomingDinners() ottiene tutti i prossimi cene, la query non viene eseguita nel database fino a quando si chiama ToList() nella riga successiva. E questo è dopo che salti 10 righe e ottieni solo
il prossimo 20.

+0

lo controllerò. ah, capisco. la tua ultima frase mi ha illuminato molto! grazie mille! – gabe

+0

Ti consiglio di controllare l'intero campione, ma il link che ho fornito è il capitolo che spiega in modo più dettagliato il funzionamento di IQueryable. – jvanderh

+0

lo faccio mentre commentiamo – gabe

5

Ti sbagli. PagedList lo farà sul server DB, in quanto ha estensioni IQueryable.

+0

quindi quale sarebbe la sintassi dell'azione del controller? tutto ciò che ho visto fa qualcosa come productRepository.GetAllProducts(). ToPagedList (pageIndex, pageSize). – gabe

+1

Sì, è giusto. Questo converte ** solo la pagina selezionata ** in IEnumerable. L'impaginazione viene eseguita sul server DB tramite IQueryable. Idem per Count. –

+1

il mio problema era che non sapevo cosa facesse IQueryable (cioè "esecuzione differita"). i tuoi commenti e gli altri mi hanno indirizzato nella giusta direzione per la comprensione. grazie! – gabe

3

ScottGu ha una serie di blog multiparte molto bella sull'uso di LINQ in Asp.Net (incluso MVC). Consiglio di leggere l'intera serie a partire dalla prima parte, ma le copertine Part 3 riguardano esattamente ciò che stai cercando: la sezione intitolata "Paging our Query Results" riguarda specificamente il paging nel database.

2

non sarebbe più efficiente implementare una procedura memorizzata che utilizza i parametri @StartPage e @PageSize?

questo modo si sta solo recuperando il sottoinsieme di dati che viene effettivamente utilizzato

semplicemente avere un parametro out chiamato totalCount o qualcosa di simile in modo da sapere quanti link pagina per creare e ogni link evento onclick passerà il numero di pagina a una funzione javascript che in modo asincrono caricare il div o altro elemento HTML con più dati

facile

+0

LINQ fa la stessa cosa con Skip() e Take(). Se i tuoi dati sono accessibili da una moltitudine di applicazioni, suppongo che una stored procedure sia una buona idea. In caso contrario, LINQ è molto più semplice da implementare, leggere e eseguire il debug. – jrjensen