如何使用Linq将DataTable按多行/列分组到具有重复行连接的新数据表中?

时间:2010-02-18 23:52:59

标签: linq datatable group-by

上帝,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列的值,以便选择连接的值。

1 个答案:

答案 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()),
};