LINQ の「グループごとの最大」問題を解決しようとしています。まず、次の構造を持つ Entity Framework を使用してモデル化されたデータベースを用意します。
Customer:
---------
CustomerID : Int32
Name : String
Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal
これにより、顧客から注文へのナビゲーションと、注文から所有者へのナビゲーションが可能になります。
データベースで上位 10 件の顧客注文を検索できる LINQ クエリを作成しようとしています。単純なケースは、非常に簡単に思いつくことができました。
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Take(10);
ただし、このリストには固有の顧客のみを表示したいと考えています。私はまだLINQに少し慣れていませんが、これが私が思いついたものです:
var q = (
from order in _data.Orders // ObjectQuery<Order>
group order by order.Customer into o
select new {
Name = o.Key.Name,
Amount = o.FirstOrDefault().Amount
}
).OrderByDescending(o => o.Amount).Take(10);
これはうまくいくようですが、これが最善のアプローチであるかどうかはわかりません。具体的には、非常に大規模なデータベースに対するこのようなクエリのパフォーマンスについて疑問に思います。また、FirstOrDefault
グループ クエリのメソッドを使用すると、少し奇妙に見えます...
誰かがより良いアプローチを提供したり、これが正しいことを保証したりできますか?