2014-01-30 120 views
0

我正在寻找一个LINQ查询两列第三列的总和,其输入和输出数据表是如下 -GROUP BY 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),因为在输入数据表中没有用于user1的q3记录,请帮助在这方面,再次感谢

回答

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(); 
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 }]); 
} 

但是,我不知道为什么你的RESU lt表包含此行:

User1 | q3 | 0 

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

+0

嗨,蒂姆,感谢您的回复,但第一个代码抛出错误 - “指定的演员无效”绑定到表2 – user3240893

+0

@ user3240893:那么列'Count'不是'int'列,但(我猜)一个字符串列。改变这一点。 –

+0

User1 | q3 | 0;我想为输入表 – user3240893