0

Industry と Weight でグループ化されたグループから 1 つの項目だけを検索するクエリを作成しようとしています。次に、この項目から、Weight が Max で Balance も Max である場所を取得する必要があります。これは例です。

var data = new[] {
new {ID = 1, Industry = 2, Weight = 2, Balance = 500}, 
new {ID = 2, Industry = 2, Weight = 2, Balance = 300}, 
new {ID = 3, Industry = 2, Weight = 1, Balance = 100},
new {ID = 5, Industry = 4, Weight = 1, Balance = 100}, 
new {ID = 6, Industry = 4, Weight = 2, Balance = 150}, 
new {ID = 7, Industry = 4, Weight = 1, Balance = 300},
};

var res = from a in data group a by new {a.Industry, a.Weight} into g
let ID = g.First().ID
let Balance = g.Max(a => a.Balance)
select new { ID, g.Key.Industry, g.Key.Weight, Balance};
Console.WriteLine(res);

結果として、2つのレコードのみを取得する必要があります

ID   Industry   Weight   Balance
1      2           2      500
6      4           2      150

しかし、上記のクエリでは 4 つのレコードが得られました 何かアドバイスはありますか?

よろしく、 ドミトリー

4

2 に答える 2

0

おそらくさまざまな解決策がありますが、その 1 つは、業界ごとにグループ化し、「最初に選択する要素」の基準に従って各グループを並べ替えてから、各グループの最初の項目を選択することです。

var res = from item in data
    group item by item.Industry into g
    let first = g.OrderByDescending(x => x.Weight)
                  .ThenByDescending(x => x.Balance).First()
    select first;
于 2012-05-14T18:42:06.897 に答える
0
data.GroupBy(x=>new {x.Industry,x.Weight})
    .ToDictionary(y=>y.Key,y=>y.ToList().Max(x=>x.Balance));

辞書が必要ない場合は、次のように新しい DTO または動的オブジェクトを選択することもできます。

data.GroupBy(x=>new {x.Industry,x.Weight})
    .Select(x=>new {x.Key.Industry,x.Key.Weight,x.ToList().Max(y=>y.Balance)});

うまくいけば、それがあなたが必要とするものです。

于 2012-05-14T18:45:10.950 に答える