Begrenzen Sie die Anzahl der Ergebnisse, die in einer Liste von Linq zurückgegeben werden

74

Ich verwende Linq / EF4.1, um einige Ergebnisse aus einer Datenbank abzurufen, und möchte die Ergebnisse auf die (X) neuesten Ergebnisse beschränken. Wobei X eine vom Benutzer festgelegte Zahl ist.

Gibt es eine Möglichkeit, dies zu tun?

Ich gebe sie derzeit zurück, um festzustellen, Listob dies zur Einschränkung der Ergebnismenge beiträgt. Während ich dies durch Schleifen einschränken kann, bis ich X drücke, gehe ich einfach davon aus, dass die zusätzlichen Daten nicht weitergegeben werden.

Nur für den Fall, dass es relevant ist ... C # MVC3-Projekt, das aus einer SQL Server-Datenbank ausgeführt wird.

Jared
quelle
4
fragst du nach linq "take (100)"?
Daryal

Antworten:

143

Verwenden Sie die TakeFunktion

int numberOfrecords=10; // read from user
listOfItems.OrderByDescending(x => x.CreatedDate).Take(numberOfrecords)

Angenommen, es listOfItemshandelt sich um eine Liste Ihrer Entitätsobjekte und CreatedDateum ein Feld mit dem Erstellungsdatum (hier wird die Reihenfolge durch Absteigen ausgeführt, um die letzten Elemente abzurufen).

Die Funktion Take () gibt eine bestimmte Anzahl zusammenhängender Elemente vom Beginn einer Sequenz an zurück.

http://msdn.microsoft.com/en-us/library/bb503062.aspx

Shyju
quelle
1
"Neueste Ergebnisse" - das wird in Ihrer Antwort nicht angesprochen.
Herr TA
@ Mr.TA: Ah! Ich habe diesen Teil verpasst. Jetzt aktualisiert. Vielen Dank für den Hinweis.
Shyju
1
Während ich beim letzten Teil nicht wirklich Hilfe brauchte (ich habe die Frage schlecht formuliert), war die Einstellung genau das, was ich brauchte! Vielen Dank!
Jared
1
Sobald die dumme Wartezeit für die Auswahl des Antwort-Timers abgelaufen ist, werde ich Ihre Antwort auswählen ...
Jared
@Shyju nein lässt mich nicht zu und sagt, dass die Antwort bearbeitet werden muss. Seltsam.
Herr TA
30
results = results.OrderByDescending(x=>x.Date).Take(10);

Das OrderByDescending sortiert Elemente nach Ihrer Datums- / Uhrzeit-Eigenschaft (oder nach der Logik, die Sie verwenden möchten, um die neuesten Elemente abzurufen), und Take beschränkt sich auf die ersten x Elemente (die ersten sind dank der Bestellung die neuesten).

Bearbeiten: Um einige Zeilen zurückzugeben, die nicht in der ersten Zeile beginnen, verwenden Sie Skip():

results = results.OrderByDescending(x=>x.Date).Skip(50).Take(10);
Herr TA
quelle
1
Ist es möglich, Ergebnisse beginnend mit einem Index zu erfassen? Zum Beispiel einhundert Ergebnisse - beginnen Sie mit Index 50, nehmen Sie 10 Ergebnisse von 50 - 60?
FrenkyB
2
@FrenkyB Bitte sehen Sie die Antwort - Ich habe sie aktualisiert, um Ihr Follow-up zu adressieren.
Herr TA
18

Verwenden Sie diese Option Take(), bevor Sie sie in eine Liste konvertieren. Auf diese Weise kann EF die von ihm erstellte Abfrage optimieren und nur die Daten zurückgeben, die Sie benötigen.

RedFilter
quelle
1
Würden Sie bitte mehr ausarbeiten. Vielleicht mit einem Beispiel?
WM
3
@WM Mit Take first kann EF das Paging direkt in der SQL-Abfrage ausführen. Wenn Sie stattdessen zuerst ToList ausführen, werden alle Ergebnisse aus SQL zurückgezogen, und das Paging wird dann im Speicher ausgeführt.
RedFilter
@ RedFilter ist die einzige Person, die mein Anliegen angesprochen hat. Ich habe einen Satz von 31000 Artikeln ... es schien verschwenderisch, die gesamte Liste zu erfassen, nur damit ich die Top 10 von der Liste streichen kann. Es würde mir jedoch nichts ausmachen, ein Beispiel zu sehen :)
Joshua K