2012-06-04 6 views
36

Ich verwende Linq/EF4.1, um einige Ergebnisse aus einer Datenbank zu ziehen und möchte die Ergebnisse auf die (X) neuesten Ergebnisse beschränken. Wobei X eine vom Benutzer festgelegte Nummer ist.Begrenzen der Anzahl von Ergebnissen, die in einer Liste von Linq zurückgegeben werden

Gibt es eine Möglichkeit, dies zu tun?

Ich übergebe sie gerade zurück als List, wenn dies bei der Begrenzung der Ergebnismenge hilft. Während ich das durch Schleifen begrenzen kann, bis ich X treffe, würde ich einfach annehmen, dass ich die zusätzlichen Daten nicht weitergeben werde.

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

+3

Fragen Sie nach linq "Take (100)"? – daryal

Antwort

69

Verwenden Sie die Take Funktion

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

listOfItems Unter der Annahme Liste Ihrer Entitätsobjekten und CreatedDate ist ein Feld, das das Datum erstellt Wert (hier verwendet, um das zu tun, durch die jüngsten Einzelteile zu erhalten absteigend).

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

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

+1

"neueste Ergebnisse" - das wird nicht durch Ihre Antwort angesprochen. –

+0

@ Mr.TA: Ah! Ich habe diesen Teil vermisst. Jetzt aktualisiert Danke für das Aufzeigen. – Shyju

+1

Während ich mit dem letzten Teil nicht wirklich Hilfe brauchte (ich formulierte die Frage schlecht), ist das Take das, was ich brauchte! Vielen Dank! – Jared

17
results = results.OrderByDescending(x=>x.Date).Take(10); 

Die OrderByDescending Artikel von Ihrem Datum/Uhrzeit Eigenschaft sortieren (oder w/e Logik, die Sie verwenden möchten letzten bekommen) und erste x Artikel begrenzen nehmen (erste zuletzt, dank der Bestellung).

Edit: einige Zeilen Rückkehr nicht in der ersten Reihe starten, verwenden Skip():

results = results.OrderByDescending(x=>x.Date).Skip(50).Take(10); 
+1

Ist es möglich, Ergebnisse mit einem Index zu beginnen? Zum Beispiel, einhundert Ergebnisse - beginnen mit Index 50, nehmen Sie 10 Ergebnisse, von 50 - 60? – FrenkyB

+2

@FrenkyB siehe bitte die Antwort - Ich habe es aktualisiert, um Ihre Follow-up zu adressieren. –

+0

Wunderbar, vielen Dank :) – FrenkyB

10

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

+1

Würdest du bitte mehr ausarbeiten. Vielleicht mit einem Beispiel? –

+1

@ W.M. Wenn Sie zuerst Take verwenden, kann EF das Paging direkt in der SQL-Abfrage durchführen. Wenn Sie stattdessen zuerst ToList ausführen, werden alle Ergebnisse aus SQL abgerufen, und das Auslagern erfolgt dann im Arbeitsspeicher. – RedFilter

Verwandte Themen