2010-01-05 14 views
10

Aby uzyskać stronę z bazy muszę wykonać coś takiego:uzyskać całkowitą liczbę rekordów, gdy robi paginacji

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

to pominie pierwszych 10 wierszy i wybierze następną 10.

Skąd mogę wiedzieć, ile wierszy mogłoby powstać z powodu zapytania bez podziału na strony? Nie chcę uruchamiać kolejnej kwerendy, aby uzyskać liczbę.

Odpowiedz

16

Aby uzyskać całkowitą liczbę rekordów przed pominięciem/pobieraniem, należy uruchomić osobne zapytanie. Uzyskanie rzeczywistej liczby zwróconej użyłoby funkcji Count(), ale nie spowodowałoby innego zapytania, gdyby pierwotne zapytanie zostało zmaterializowane.

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

Czy to rozdzielenie 2 wyników zapytania w dolnym perfomence dla partii dane i kompleks, gdzie warunki? –

9

Dolna linia: musisz uruchomić dwa zapytania. Po prostu nie da się tego obejść.

Oto dobry sposób na to jednak, że buforuje oryginalnego kwerendy LINQ i filtra, co dla mniej kopiuj/wklej błędów:

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

Myślałem o tym - ale pytanie; będzie wywoływać q.Count(); załadować wszystkie zapisy w pamięci? – effkay

+3

Nie, q.Count() wygeneruje zapytanie SQL 'SELECT COUNT (*)'. –

+4

Nie. Wywołanie q.Count() spowoduje, że SQL będzie miał postać 'SELECT count (*) where ...', która zwróci wartość całkowitą. Żadne zapisy nie zostaną załadowane do pamięci. – Randolpho

Powiązane problemy