如何在LINQ中按列分组?

时间:2013-06-24 19:59:48

标签: .net vb.net linq datatable

我想通过此Excel电子表格中显示的“更改日期”列对VB.NET DataTable进行分组:

Spreadsheet representation of DataTable

所以,最终结果如下:

End Result

目前,我正在尝试通过以下LINQ查询将行组合在一起:

Dim lQuery = From d In dtData Group d By key = "Change Date" Into Group _
               Select changeDate = key, testGroup = Group

最终目标是使用指定的分组创建新的DataTable。

更新:我觉得我在以下方面取得了一些进展:

Dim tester = dtData.AsEnumerable().GroupBy(Function(row) New With { _
                                   Key .ChangeDate = row("Change Date")})

dtData = LINQToDataTable(tester)

我从http://forums.asp.net/post/4469664.aspx获得了LINQToDataTable函数,因为没有出现CopyToDataTableMethod。

这将创建以下数据表:

enter image description here

它显然正确分组,但它没有选择其他列。有什么建议吗?

更新:

所以我接受了D Stanley的建议并将我的LINQ查询修改为以下内容:

Dim lQuery = From d In dtData.AsEnumerable() _
             Group d By key = "Change Date" _
             Into test = Sum(d(2)), _
             test2 = Sum(d(3))

此代码在Sum()函数上产生以下错误:

Sum() Error

因此,我尝试将行值转换为正确编译的双精度值,但在尝试将空值转换为double时显然会抛出运行时异常:

Dim lQuery = From d In dtData.AsEnumerable() _
             Group d By key = "Change Date" _
             Into test = Sum(CDbl(d(2))), _
             test2 = Sum(CDbl(d(3)))

我应该将什么传递给Sum函数,以便它能正确编译并正确运行?

2 个答案:

答案 0 :(得分:1)

您缺少聚合

Dim lQuery = From d In dtData 
             Group d By key = "Change Date"  
             Into 2008 = Sum(d.2008),
                  2009 = Sum(d.2009),
                  ... etc.

用您用于这些列的任何成员名称替换20082009等。

答案 1 :(得分:0)

也许这就是你想要做的事情?

Dim lQuery = From d In dtData Group d By key = d.changeDate Into Group _
           Select changeDate = key, testGroup = Group