1. ホーム
  2. c#

[解決済み] エンティティフレームワークのトップ5を選択

2023-05-19 09:10:48

質問

私は

[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<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に変換してくれるのです。