Спробуйте це:
var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);
Це повертається IQueryable<Person>
. Він ще не повертає результатів, оскільки реалізує відкладене виконання. Він буде перекладений на SQL і виконаний при необхідності:
var metarializedItems = items.ToList();
або
foreach(var item in items)
Наведений вище приклад перекладе на SQL подібний до цього:
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
Це не буде саме цей SQL. Різні версії EF можуть створювати різні SQL, але я написав їх, щоб проілюструвати, як це працює. Take(5)
перекладається на TOP 5
. OrderByDescending(u => u.OnlineAccounts.Count)
перекладається на ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
. Це сила Entity Framework. Він перекладає вирази .NET у SQL.
SELECT TOP 5...
запитом до бази даних?