0

我正在尝试编写一个查询来从组中只找到一项,它们按行业和重量分组,然后从这个我必须得到重量最大和平衡最大的地方这是示例:

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);

所以结果我应该只得到两条记录

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

但是通过上面的查询,我得到了 4 条记录有什么建议吗?

问候, 德米特里

4

2 回答 2

0

可能有许多不同的解决方案,但一种是仅按行业分组并根据您的“第一个要选择的元素”标准对每个组进行排序,然后选择每个组中的第一个项目。

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 回答