Wählen Sie die Top 5 im Entity Framework aus

76

ich habe

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

Jede Person darf 0- * OnlineAccount haben.

Wie wähle ich im Entity Framework mit C # die Top 5 Person mit den meisten Konten aus?

fishiefishie
quelle

Antworten:

159

Versuche dies:

var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);

Dies kehrt zurück IQueryable<Person>. Es werden noch keine Ergebnisse zurückgegeben, da die verzögerte Ausführung implementiert wird. Es wird in SQL übersetzt und bei Bedarf ausgeführt:

var metarializedItems = items.ToList(); // ToList forces execution

oder

foreach(var item in items) // foreach forces execution

Das obige Beispiel übersetzt in SQL ähnlich diesem:

SELECT TOP 5 p.PersonID, p.EmailAddress, p.FirstName, p.LastName 
FROM Person p
ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC

Es wird nicht genau diese SQL sein. Unterschiedliche EF-Versionen können unterschiedliche SQLs erzeugen, aber ich habe sie geschrieben, um die Funktionsweise zu veranschaulichen. Take(5)wird übersetzt in TOP 5. OrderByDescending(u => u.OnlineAccounts.Count)wird übersetzt in ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC. Dies ist die Kraft von Entity Framework. Es übersetzt .NET-Ausdrücke in SQL.

LukLed
quelle
Wird dies tatsächlich als SELECT TOP 5...Abfrage für die Datenbank enden ?
Peter Lillevold
@ Peter Lillevold: Ja. Bei der Ausführung der Abfrage werden nur 5 Zeilen benötigt.
LukLed
4
@MatthewPK: Ich bin nicht sicher, wie ich Sie überzeugen soll :) Bitte nehmen Sie den SQL-Profiler und überprüfen Sie ihn. Sie sehen nur 5 Zeilen aus der Datenbank :)
LukLed
1
@LukLed bestätigt mit LinqPad, +1!
Matthew
1
genial.
Ich hatte