2010-01-05 8 views
10

Um eine Seite aus einer Datenbank bekomme ich so etwas wie dies auszuführen haben:die Gesamtzahl der Datensätze erhalten, sobald eine Paginierung tun

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

Dadurch werden die ersten 10 Zeilen überspringen und die nächste 10.

wählen

Wie kann ich wissen, wie viele Zeilen wegen der Abfrage ohne Paginierung ergeben würden? Ich möchte keine weitere Abfrage ausführen, um die Zählung zu erhalten.

Antwort

16

Um die Gesamtzahl der Datensätze vor dem Überspringen/Take zu erhalten, müssen Sie eine separate Abfrage ausführen. Das Abrufen der tatsächlichen zurückgegebenen Nummer würde Count() verwenden, würde aber nicht zu einer anderen Abfrage führen, wenn die ursprüngliche Abfrage materialisiert wurde.

+0

Ist diese Trennung von 2 Abfrage führt zu einer geringeren perfomence für viele Daten und komplex, wo Bedingungen? –

9

Fazit: Sie müssen zwei Abfragen ausführen. Du kommst einfach nicht herum.

Hier ist ein guter Weg, es zu tun, aber, dass Caches die ursprüngliche LINQ-Abfrage und Filter, für weniger copy/paste Fehler machen:

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

Ich habe gerade darüber nachgedacht - aber eine Frage; wird den q.Count() aufrufen; alle Datensätze im Speicher laden? – effkay

+3

Nein, q.Count() generiert eine SQL 'SELECT COUNT (*)' -Abfrage. –

+4

Nein. Der Aufruf von q.Count() führt zu SQL in den Zeilen 'SELECT count (*) wo ...', was nur einen ganzzahligen Wert zurückgibt. Es werden keine Datensätze in den Speicher geladen. – Randolpho

Verwandte Themen