0

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グループ クエリのメソッドを使用すると、少し奇妙に見えます...

誰かがより良いアプローチを提供したり、これが正しいことを保証したりできますか?

4

2 に答える 2

0
Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
于 2010-01-09T20:56:46.403 に答える
0

あなたがすることができます:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Distinct().Take(10);

私は通常、生成された SQL を見て、何が最適かを判断します。

于 2010-01-09T20:30:12.760 に答える