2010-01-05 8 views
10

Per ottenere una pagina da un database devo eseguire qualcosa di simile:Prendi il numero totale di record quando si fa l'impaginazione

var cs = (from x in base.EntityDataContext.Corporates 
    select x).Skip(10).Take(10); 

Questo salterà le prime 10 righe e selezionerà il prossimo 10.

Come posso sapere quante righe risulterebbero a causa della query senza impaginazione? Non voglio eseguire un'altra query per ottenere il conteggio.

risposta

16

Per ottenere il numero totale di record prima di saltare/eseguire, è necessario eseguire una query separata. Ottenere il numero effettivo restituito userebbe Count(), ma non darebbe come risultato un'altra query se la query originale fosse materializzata.

var q = from x in base.EntityDataContext.Corporates 
     select x; 

var total = q.Count(); 
var cs = q.Skip(10).Take(10); 
var numberOnSelectedPage = cs.Count(); 
+0

È questa separazione di 2 risultati della query in perfomence inferiore per un sacco di dati e complessi dove condizioni? –

9

Bottom line: è necessario eseguire due query. Semplicemente non puoi aggirarlo.

Ecco un buon modo per farlo, tuttavia, che memorizza nella cache il query LINQ originale e filtro, rendendo per meno errori di copia/incolla:

var qry = from x in base.EntityDataContext.Coporates select x; 
var count = qry.Count(); 
var items = qry.Skip(10).Take(10).ToList(); 
+1

Ho solo pensato di farlo - ma una domanda; chiamerà il q.Count(); carica tutti i record in memoria? – effkay

+3

No, q.Count() genererà una query 'SELECT COUNT (*)' di SQL. –

+4

No. La chiamata a q.Count() restituirà SQL lungo le righe di 'SELECT count (*) dove ...', che restituirà solo un valore intero. Nessun record verrà caricato in memoria. – Randolpho

Problemi correlati