Ответ 1
Попробуйте следующее:
var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);
Это возвращает IQueryable<Person>
. Он еще не возвращает результаты, поскольку он реализует отложенное выполнение. Он будет переведен на SQL и выполнен, если необходимо:
var metarializedItems = items.ToList(); // ToList forces execution
или
foreach(var item in items) // foreach forces execution
Пример выше переведёт в 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.