выберите топ 5 в рамках сущности - PullRequest
55 голосов
/ 17 апреля 2010

у меня

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

Каждый человек может иметь 0- * OnlineAccount.

В структуре сущностей с C # как выбрать 5 лучших людей, у которых больше всего аккаунтов?

1 Ответ

125 голосов
/ 17 апреля 2010

Попробуйте это:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...