DataTable上的GroupBy和Sum

时间:2013-06-24 07:26:47

标签: .net vb.net linq group-by sum

我在数据表中使用VB中的LINQ来过滤我的结果。

m_oDataTable.Columns.Add("Name1", GetType(String))
m_oDataTable.Columns.Add("Name2", GetType(String))
m_oDataTable.Columns.Add("Time", GetType(Double))

我正在尝试根据用户选择按Name1Name2过滤数据表。

groupBy = "Name1" 
'groupBy = "Name2"

我对数据进行了分组,但我无法Sum所需的字段。

Dim test =  From tab In m_oDataTable.AsEnumerable()
            Group tab By groupDt = tab.Field(Of String)(groupBy) Into Group
            Select Group

'Getting Error
Dim test2 = From tab In m_oDataTable.AsEnumerable()
            Group tab By groupDt = tab.Field(Of String)(groupBy) Into Group
            Select New With 
            {
             .Grp = Key, ' Error in this line(Key is a type, cannot be used as a expression)
             .Sum = Group.Sum(Function(r) Double.Parse(r.Item("Time").ToString()))
            }

我在c#中尝试过并获得了理想的结果。但是VB没有运气:(

var test = from tab in m_oDataTable.AsEnumerable()
           group tab by tab.Field<string>(groupBy)
                 into groupDt
                 select new
                 {
                     Group = groupDt.Key,
                     Sum = groupDt.Sum(r => double.Parse(r["Time"].ToString()))
                 };

如何在VB中实现这一点?

1 个答案:

答案 0 :(得分:2)

不是100%确定为什么但VB.Net不支持.Key查询表达式语法。您实际上在查询中定义了键变量。您正在尝试使用尚未定义的变量“Key”。相反,您需要使用在查询中定义的键(groupDt)。

更改一个小行,它应该有用......

Select New With 
                {
                 .Grp = groupDt,
                 .Sum = Group.Sum(Function(r) Double.Parse(r.Item("Time").ToString()))
                }

或者你可以使用流利的语法:

Dim test2 = Table.AsEnumerable().GroupBy(Function(row) row.Item("Name1")).Select(Function(group) New With {.Grp = group.Key, .Sum = group.Sum(Function(r) Double.Parse(r.Item("Time").ToString()))})