C# 按多列对DataTable分组并连接字符串

C# 按多列对DataTable分组并连接字符串,c#,linq,datatable,C#,Linq,Datatable,我已经看到了这个问题的很多答案,但不幸的是,我无法将它们与我的特定场景关联起来,因为当我尝试在分组LINQ语句中连接字符串时,我被限制在String.Join上的扩展重载上,这似乎不起作用 本质上,我在代码中有两个数据表,每个表有四条记录(所有字符串)。我需要按两列进行分组,同时用“,”分隔符连接其他两个字段 这两个表的分组基础是相同的,但是分组在不同的列集合上,因此我假设我可以将解决方案应用于一个实例,也应用于另一个实例 我在代码中有以下数据表: 我需要通过联系人和电子邮件对此数据表进行分组

我已经看到了这个问题的很多答案,但不幸的是,我无法将它们与我的特定场景关联起来,因为当我尝试在分组LINQ语句中连接字符串时,我被限制在
String.Join
上的扩展重载上,这似乎不起作用

本质上,我在代码中有两个数据表,每个表有四条记录(所有字符串)。我需要按两列进行分组,同时用“,”分隔符连接其他两个字段

这两个表的分组基础是相同的,但是分组在不同的列集合上,因此我假设我可以将解决方案应用于一个实例,也应用于另一个实例

我在代码中有以下数据表:

我需要通过联系人和电子邮件对此数据表进行分组,同时使用“,”分隔符连接引用和附件,以生成以下数据集:

然后,我有了第二个数据表,我需要通过引用和附件对其进行分组,同时使用“,”分隔符连接联系人和电子邮件。数据集当前将包含以下数据:

我试图使用此集合实现的是一个包含以下信息的数据表:


以下查询为我提供了预期的输出:-

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")))
           });
var result=dt1.AsEnumerable()
.GroupBy(x=>new{Contact=x.Field(“Contact”),
Email=x.Field(“Email”)})
.选择(x=>new
{
REFERENCE=String.Join(“,”x.Select(z=>z.Field(“REFERENCE”)),
触点=x.Key.CONTACT,
EMAIL=x.Key.EMAIL,
附件=String.Join(“,”,x.Select(z=>z.Field(“附件”))
});
输出:

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


类似地,您可以查询第二个数据表。

您可以显示用于对数据表进行分组的linq代码吗。。?也可以查看之前的帖子@MethodMan,我想这是我正在寻找的解决方案之一,但是,只有一个列进行分组;当我涉及多个分组列时,似乎需要不同的语法。下面是我正在使用的LINQ代码:
var finalizedSingleContactMultipleReferences=from-in-SingleContactMultipleReferences.AsEnumerable()将行按新的{CONTACT=row.Field(“CONTACT”),EMAIL=row.Field(“EMAIL”)}分组到grp中选择新的{REFERENCE=grp.Join,CONTACT=grp.Key.CONTACT,EMAIL=grp.Key.EMAIL,ATTACHMENT=grp.Join}
@Your_unequality-在上述查询中,
grp.Join
不正确,因为需要连接两个实体。你需要
String.Join
,就像我在答案中提到的那样。只需将您的
REFERENCE=grp.Join
替换为
REFERENCE=String.Join(“,”,grp.Select(z=>z.Field(“REFERENCE”))
这非常有效,非常感谢。还感谢您指出问题的本质(使用的是
grp.Join
而不是
String.Join
)。