2016-04-26 33 views
3

Ich versuche, 5 ältesten Einträge aus meiner Datenbank auszuwählen. Ich verwende die folgende Erklärung ab:C# Entity Framwork - Order by und Take

dbContext.Items.Take(5).OrderBy(i => i.LastCheck).ToListAsync(); 

Das Problem hierbei ist, dass EF zuerst die ersten 5 Elemente aus der Tabelle nimmt, und sortiert sie dann. So bekomme ich immer die 5 ersten Einträge aus der Tabelle. Aber ich mag es zuerst um die Elemente zu sortieren und dann die Top-5 diejenigen wählen, wie wenn ich diesen SQL-Befehl ausführen:

select top 5 * from Items order by LastCheck asc 

Hier bekomme ich das richtige Ergebnis.

Gibt es eine Möglichkeit, das in EF zu tun, oder muss ich die Abfrage ausführen?

dank

+0

Bestellen Sie die Artikel zuerst, dann nehmen Sie ... – Gusman

+0

Schalten Sie einfach Ihre 'OrderBy()' und 'Take()'. – itsme86

+0

Tauschen Sie einfach die Position von orderby und nehmen Sie .... – Norgerman

Antwort

4

Sie Take() und OrderBy()

dbContext.Items.OrderBy(i => i.LastCheck).Take(5).ToListAsync(); 
+0

Interessant. Da ich nach 2 Parametern geordnet habe (OrderBy (i => i.LastCheck) .Dann ...) habe ich versucht, das Take (5) zwischen sie zu setzen und ich habe einen Fehler bekommen, aber ich habe nicht versucht, das Take an den zu stellen Ende. Thats it, danke – rimes

+0

'ThenBy()' benötigt eine 'IOrderedEnumerable' die von' OrderBy() 'bereitgestellt wird, aber nicht von' Take() ' – fubo

+1

Sie könnten Ihre zwei Ordnungen wie folgt schreiben: dbcontext.Items.OrderBy (x = > x.LastCheck) .Nehmen (5) .OrderBy (y => y.someProp) 'Auf diese Weise muss das zweite' OrderBy' nur die restlichen 5 Elemente sortieren, aber natürlich wird Ihre Reihenfolge durch LastCheck zerstört. – derpirscher

0

Denken Sie diese bereits beantwortet wurde oben wechseln müssen, aber: -

dbContext.Items.OrderBy(x=>x.LastCheck).Take(5).ToListAsync(); 

würde wählen Sie Ihre Top-5-Artikel zuerst nehmen Doing aus der Liste, und sortieren Sie dann nur diese 5, während, was Sie tun möchten, sortieren Sie die Liste zuerst in Datum Reihenfolge und nehmen Sie dann die Top 5.

Ebenso, wenn Sie neueste zuerst das sortieren, indem Sie wollte obige Abfrage (es um sicherzustellen, sortiert) würde: -

dbContext.Items.OrderByDescending(x=>x.LastCheck).Take(5).ToListAsync(); 

hoffe, das hilft!