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.
Questo in realtà finirà come una query 'SELECT TOP 5 ...' contro il database? –
@Peter Lillevold: Sì. Ci vorranno solo 5 righe nell'esecuzione della query. – LukLed
@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