2009-04-27 9 views
21

Qual è lo schema migliore per ottenere risultati impaginati con LINQ su SQL?Risultati di ricerca impaginati con LINQ su SQL

Ho il seguente scenario:

Supponiamo che voglio cercare articoli tavolo da descrizione. Posso fare facilmente:

public IQueryable<Item> FindItemsByDescription(string description) 
{ 
    return from item in _dc.Items 
      where item.Description.Contains(description); 
} 

Ora, quale sarebbe il modo migliore per impaginare questo set di risultati?

  1. Devo eseguire un conteggio domanda prima di fare questo per scoprire la dimensione set di risultati e quindi limitare la query in base a quello che voglio? Mi sento come se questa fosse la strada da percorrere.
  2. Devo eseguire la query completa, prendere il conteggio dalla dimensione dell'array e restituire solo un sottoinsieme impaginato da questo array? Credo che questo sarà un enorme spreco di tempo se il set di risultati è abbastanza grande ... O è LINQ a SQL fare un po 'di magia qui?

Esiste uno schema LINQ to SQL per eseguire questa operazione?

MODIFICA: I deve chiarire una piccola cosa. Sono a conoscenza dei metodi Take and Skip. Ma, prima di utilizzare Prendere e Salta, come dovrei ottenere il conteggio totale dei risultati che la query recupererebbe?

risposta

30

Il modello per la paginazione è molto semplice. Essa implica l'uso del Skip() e prendere() metodi di estensione come segue:

public IQueryable<Item> FindItemsByDescription(string description, int pageIndex, int pageSize) 
{ 
    return from item in _dc.Items 
      where item.Description. 
      Contains(description). 
      Skip((pageIndex - 1) * pageSize). 
      Take(pageSize); 
} 

AGGIORNAMENTO: per ottenere il conteggio totale è sufficiente utilizzare il metodo Count():

int totalCount = from item in _dc.Items 
       where item.Description. 
       Contains(description).Count(); 

int numberOfPages = (int)(totalCount/pageSize); 

seconda su come si sta andando a visualizzare i record, è possibile utilizzare il numero di pagine per visualizzare una barra di spostamento con "Pagina X di Y" ... Pagina 1 di 10, ecc.

+0

Pablo - Ho aggiornato il mio post per includere più informazioni sul paging. (Salu2) –

+0

Grazie mille Basilio. È questo, il rendimento è il modo migliore per farlo? Sapete quante query verranno eseguite contro il server SQL con questo approccio? –

+3

Pablo - Il codice nell'esempio eseguirà 2 query SQL separate. Tuttavia, questo non deve essere il caso. Puoi prendere i risultati dalla query e inserirla in una lista usando ToList(), quindi ottenere il Count() da quello.In modo che si finisca con una sola chiamata al database. –

2

È possibile utilizzare il metodo di estensione Prendere:

public IQueryable<Item> FindItemsByDescription(string description, int resultAmount) 
{ 
    return from item in _dc.Items 
      where item.Description.Contains(description).Take(resultAmount); 
} 

si può prendere questo un ulteriore passo avanti e l'uso Passa per le successive "pagine":

public IQueryable<Item> FindItemsByDescription(string description, int resultAmount, int page) 
{ 
    return from item in _dc.Items 
      where item.Description.Contains(description).Skip(resultAmount * page).Take(resultAmount); 
} 
+0

Grazie mille per la risposta rapida. Sono a conoscenza dell'adozione dei metodi Take e Skip. Tuttavia, se voglio davvero impaginare, devo sapere qual è il numero totale di risultati senza impaginare. Quindi, qual è il modo migliore per ottenere quel * numero totale *? –