使用linq从数据表中用逗号分隔值

时间:2016-12-14 10:43:50

标签: .net vb.net linq

enter image description here这是我的DataTable结构:

srno. areaid areaName
1     1      Mumbai
2     1      Delhi
3     1      New York
4     2      Sydney

我想查询它,结果应该是:

srno. areaid areaName
1     1      Mumbai,Delhi, New York
2     2      Sydney

这是我的疑问:

Dim grouped = From row In a.AsEnumerable()
              Group row By id = row.Field(Of String)(areaid) Into Group
              Select id, areaName = String.Join(",", From i In Group Select i.Field(Of String)("areaName")) 

我得到了结果:

  

结果=预期类型。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

Fabio指出的关键是为回归创建一个Anon类型。但是可以通过在GroupBy方法中对其进行操作来跳过组SELECT。

Dim grouped = dt.AsEnumerable().
        GroupBy(Function(row) row.Field(Of Integer)("AreaId"),
                Function(key, values) New With {
                    .Id = key,
                    .Names = String.Join(",", values.
                                      Select(Function(q) q.Field(Of String)("AreaName")))
                                               }
                ).OrderBy(Function(j) j.Id)

For Each item In grouped
    Console.WriteLine("{0}  {1}", item.Id, item.Names)
Next

我在表格中添加了一些元素(2组不是一个好的测试),并且序列不那么有序。结果:

  

1孟买,德里,纽约
  2悉尼
  3巴黎,伦敦

答案 1 :(得分:1)

Select语句中,您需要创建匿名类的实例

Dim grouped = 
    a.AsEnumerable().
      GroupBy(Function(row) row.Field(Of Integer)("areaid")).
      Select(Function(group, areaId)
                 Return New With
                 {
                     .AreaId = areaId,
                     .AreaNames = String.Join(",", group.Select(Function(row) row.Field(Of String)("areaName")))
                 }
             End Function)