Подтвердить что ты не робот

Выберите топ 5 в структуре сущности

У меня

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

Каждому человеку разрешено иметь 0- * OnlineAccount.

В инфраструктуре сущностей с С#, как выбрать верхний 5 человек с наибольшим количеством учетных записей?

4b9b3361

Ответ 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.