我正在搜索输入和输出数据表如下的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记录,请帮助这方面,再次感谢
答案 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();