2013-06-24 27 views
0

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

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

不是100%肯定为什么,但VB.Net不支持。重点对查询表达式语法。实际上,你定义的关键你试图使用一个未定义的变量“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()))})