什么是最好的Linq查询?

时间:2017-03-29 08:27:42

标签: c# linq

我有一个包含此列的表格:

Code        //int
Type        //int
Point       //int 

我希望有查询来完成这项工作:

根据CodeType执行选择并将点的总和添加到Point。我想我无法正确解释我的想法,因此我会在下面向您展示我想要的结果。

我的表:

Code           Type            Point        Date
1              1               10           someDate
1              1               20           someDate
1              2               10           someDate
1              1               30           someDate
1              2               10           someDate
2              1               30           someDate
2              2               20           someDate
2              1               10           someDate
1              2               10           someDate
1              1               10           someDate
3              2               20           someDate

我想要的结果:

row[0] : Code:1, Type:1, Point:70,
row[1] : Code:1, Type:2, Point:30,
row[2] : Code:2, Type:1, Point:40,
row[3] : Code:2, Type:2, Point:20,
row[4] : Code:3, Type:2, Point:20,

更新 如果我想要这样的结果什么是最好的查询?

row[0] : Code:1, pointType1:70, pointType2:30,
row[0] : Code:2, pointType1:40, pointType2:20,
row[0] : Code:3, pointType1:0, pointType2:20,

1 个答案:

答案 0 :(得分:3)

您可以对列表中的CodeType属性进行分组,然后使用分组结果中的Point属性的总和来预测两个键,如:

var result = list.GroupBy(x=> new { x.Code, x.Type})
                 .Select(g=> 
                             new { 
                                   Code = g.Key.Code, 
                                   Type= g.Key.Type, 
                                   Point = g.Sum(x=>x.Point)
                             })
                 .ToList();

UPDATE:

在问题示例输出更新后,以下将给出预期结果:

var result = list.GroupBy(x=> x.Code)
                     .Select(g=> 
                                 new { 
                                       Code = g.Key.Code, 
                                       PointType1= g.Where(x=>x.Type==1)
                                                    .Sum(x=>x.Point)
                                                   Key.Type, 
                                       PointType2 = g.Where(x=>x.Type==2)
                                                     .Sum(x=>x.Point)
                                 })
                     .ToList();