GROUP BY在两列上的数据表中,使用LINQ与第三列的总和

时间:2014-01-30 11:16:25

标签: c# linq datatable

我正在搜索输入和输出数据表如下的LINQ查询 -

Name    Code    count
-------------------------
User1   q1  2

user1   q2  2

user2   q2  1

user2   q3  3

user1   q1  2



Name    Code    Count
-----------------------
User1  |    q1   |  4
User1  |    q2   |  2
User1  |    q3   |  0
User2  |    q1   |  0
User2  |    q2   |  1
User2  |    q3   |  3

即。我希望每个Name的不同代码集的计数总和,在结果表中,它显示(user1,q3,0),因为在输入数据表中没有user3的q3记录,请帮助这方面,再次感谢

2 个答案:

答案 0 :(得分:2)

这应该有效:

var query = table.AsEnumerable()
    .GroupBy(row => new { Name = row.Field<string>("Name"), Code = row.Field<string>("Code") });

var table2 = table.Clone(); // empty table with same schema
foreach (var x in query)
{
    string name = x.Key.Name;
    string code = x.Key.Code;
    int count = x.Sum(r => r.Field<int>("Count"));
    table2.Rows.Add(x.Key.Name, x.Key.Code, count);
}

修改:如果您想要修改原始表并将每个名称代码组的计数相加,请使用此方法使用Dictionary作为查找:

var nameCodeCountLookup = table.AsEnumerable()
    .GroupBy(row => new { Name = row.Field<string>("Name"), Code = row.Field<string>("Code") })
    .ToDictionary(ncGrp => ncGrp.Key, ncGrp => ncGrp.Sum(r => r.Field<int>("Count")));
foreach (DataRow row in table.Rows)
{
    string Name = row.Field<string>("Name");
    string Code = row.Field<string>("Code");
    row.SetField("Count", nameCodeCountLookup[new { Name, Code }]);
}

但是,我不知道为什么你的结果表包含这一行:

User1  |    q3   |  0

原始表中没有名称 - 代码组合User1 + q3。

答案 1 :(得分:0)

我认为这就是你要找的东西:

  var result =
            new DataTable().Rows.Cast<DataRow>()
                .Select(p => new {User = p[0], Q = p[1], Value = (double) p[2]})
                .GroupBy(p => new {p.User, p.Q})
                .Select(p => new {User = p.Key.User, Q = p.Key.Q, Total = p.Sum(x => x.Value)})
                .ToList();

或几乎相同,但你也可以这样做:

   var result =
            new DataTable().Rows.Cast<DataRow>()
                .Select(p => new 
                          {
                              User = p.Field<string>("column1Name"), 
                              Q = p.Field<string>("column2Name"), 
                              Value = p.Field<double>("column3Name")
                          })
                .GroupBy(p => new {p.User, p.Q})
                .Select(p => new {User = p.Key.User, Q = p.Key.Q, Total = p.Sum(x => x.Value)})
                .ToList();