上帝,Linq让我感到困惑......我发现了很多与我需要做同样事情的例子,但我仍然全都转过身来。我有一张表(我们称之为UngroupedTable),看起来像这样......
ID,Val1,Val2
0001,A,1
0001,B,2
0002,C,3
0003,D,4
0003,D,5
我想使用Linq构建一个表,其中GroupedTable中的ID将变为唯一,并且重复ID的值将连接到各自的行中。
所以,它看起来像这样......
ID,Val1,Val2
0001,A B,1 2
0002,C,3
0003,D,4 5
我们称之为GroupedTable。
我当然得到的并不是很接近,但无论如何我都会张贴......
from row in passedInTable.AsEnumerable()
group row by new { ID = row.Field<string>("ID"), Val1 = row.Field<string>("Val1"), Val2 = row.Field<string>("Val2") } into groupedRow
select new
{
ID = groupedRow.Key.ID,
Val1 = groupedRow.Key.Val1,
Val2 = groupedRow.Key.Val2
};
我想我可以看到我在这一点上可以用一些循环来做我需要的东西,但我很确定它可以通过Linq实现。特别是基于我在那里看到的所有示例,使用.sum()作为数字类型。
修改的
我想最终的问题是,在上面的查询中,如何从选择新块中聚合val1和val2列的值,以便选择连接的值。
答案 0 :(得分:3)
您只需要按行的ID进行分组。然后,连接每个组中的所有值:
from row in passedInTable.AsEnumerable()
group row by row.Field<string>("ID") into rowGroup
select new
{
ID = rowGroup.Key,
Val1 = String.Join(" ", rowGroup.Select(row => row.Field<string>("Val1")).ToArray()),
Val2 = String.Join(" ", rowGroup.Select(row => row.Field<string>("Val2")).ToArray()),
};