виберіть топ-5 у структурі сутності


76

Я маю

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

Кожна людина може мати 0- * OnlineAccount.

У структурі сутності з C #, як вибрати найкращих 5 осіб, у яких найбільше облікових записів?

Відповіді:


161

Спробуйте це:

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.


Це насправді закінчиться SELECT TOP 5...запитом до бази даних?
Пітер Ліллевольд

@ Peter Lillevold: Так. Для виконання запиту знадобиться лише 5 рядків.
LukLed

4
@MatthewPK: Я не впевнений, як вас порадувати :) Будь ласка, візьміть SQL-профілі і перевірте. Ви побачите лише 5 рядків, взяті з бази даних :)
LukLed

1
@LukLed підтверджено LinqPad, +1!
Метью

1
дивовижний. Був зляканий, що нікуди не
дійде,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.