按多列对DataTable进行分组并连接字符串

时间:2015-10-10 16:37:50

标签: c# linq datatable

我已经看到了很多这个问题的答案,但遗憾的是无法将它们置于我的特定场景中,因为当我尝试在分组LINQ语句中连接字符串时,我被限制为{{{{{ 1}}这似乎不起作用。

基本上,我在代码中有两个DataTable,每个DataTable有四个记录(所有字符串)。我需要将两个列组合在一起,然后将其他两个字段连接到','分离器。

分组的基础对于两个表是相同的,但不同列的组是相同的,所以我假设我可以将解决方案应用于另一个实例。

我在代码中有以下DataTable:

Single Contact Multiple References Current

我需要通过CONTACT和EMAIL对这个DataTable进行分组,同时将REFERENCE和ATTACHMENT连接到',' separator,生成以​​下DataSet:

Single Contact Multiple References Required

然后我有第二个DataTable,我需要通过REFERENCE和ATTACHMENT分组,同时将CONTACT和EMAIL连接到','分隔器。 DataSet当前包含以下数据:

Single Reference Multiple Contacts Current

我想用这个集合实现的是一个包含以下信息的DataTable:

Single Reference Multiple Contacts Required

1 个答案:

答案 0 :(得分:2)

以下查询给出了预期的输出: -

var result = dt1.AsEnumerable()
        .GroupBy(x => new { Contact = x.Field<string>("CONTACT"), 
                            Email = x.Field<string>("EMAIL") })
        .Select(x => new 
           {
               REFERENCE = String.Join(",",x.Select(z => z.Field<string>("REFERENCE"))),
               CONTACT = x.Key.Contact,
               EMAIL = x.Key.Email,
               ATTACHMENT = String.Join(",",x.Select(z => z.Field<string>("ATTACHMENT")))
           });

输出:

enter image description here

此查询将返回匿名类型,而不是DataTable。如果您希望将DataTable作为输出,那么您必须使用foreach循环创建一个,或者您可以通过实施MSDN中提到的扩展方法来使用CopyToDataTable方法。

类似地,您可以查询第二个DataTable。