Я имею
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
Каждому человеку разрешают иметь 0 -* OnlineAccount.
В платформе объекта с C#, как я выбираю лучшие 5 Людей, которые имеют большинство учетных записей?
Попробуйте следующее:
var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);
Это возвращает IQueryable
. Он пока не возвращает результатов, потому что реализует отложенное выполнение. Он будет преобразован в 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 (ВЫБРАТЬ СЧЕТЧИК (*) ИЗ OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
. В этом сила Entity Framework. Он переводит выражения .NET в SQL.