2010-04-16 17 views
40

hoselezionare top 5 in Entity Framework

[Person] 
PersonID, EmailAddress, FirstName, LastName 

[OnlineAccount] 
OnlineAccountID, PersonID, Nickname 

Ogni persona è consentito di avere 0- * OnlineAccount.

In Entity Framework con C#, come selezionare la prima 5 Persona con il maggior numero di account?

risposta

93

Prova questo:

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

Questo restituisce IQueryable<Person>. Non restituisce ancora risultati, perché implementa l'esecuzione differita. Sarà tradotto per SQL ed eseguite quando necessario:

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

o

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

Esempio sopra si tradurrà in SQL simile a questo:

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 

esso non sarà questo SQL esatto. Diverse versioni di EF possono produrre SQL differenti, ma l'ho scritto per illustrare come funziona. Take(5) è tradotto in TOP 5. OrderByDescending(u => u.OnlineAccounts.Count) è tradotto in ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC. Questo è il potere di Entity Framework. Traduce le espressioni .NET in SQL.

+0

Questo in realtà finirà come una query 'SELECT TOP 5 ...' contro il database? –

+0

@Peter Lillevold: Sì. Ci vorranno solo 5 righe nell'esecuzione della query. – LukLed

+0

@LukLed Ne sei sicuro? Vuoi dire che l'EF non adempie alla sua esecuzione prima che il metodo di estensione IEnumerable elabori? Non sono sicuro che sia vero .... – Matthew

Problemi correlati