2013-06-24 5 views
0

Я использую LINQ в VB на datatable для фильтрации моих результатов.GroupBy и Sum на DataTable

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

Я пытаюсь фильтровать DataTable по Name1 или Name2 на основе выбора пользователя.

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())) 
       } 

ИЛИ вы можете свободно использовать синтаксис: