Выполните агрегацию для DataTable с Linq в vb.net - PullRequest
2 голосов
/ 22 декабря 2009

Учитывая данные, я хотел бы вывести тип IEnumerable (словарь (из T) был бы идеальным, в противном случае данные могли бы быть приемлемыми), который обеспечивает агрегирование данных в таблице данных.

В SQL я бы написал запрос так:

select groupByColumn, sum(someNumber) from myTable group by groupByColumn

В VB.NET самое близкое к этому (достигнутое с помощью информации здесь ):

' dt is a datatable containing two columns, referred to by index in p below
Dim q = From p In dt Group p By p(0) Into Sum(p(1)) Select p(0), SumOfNumber = Sum

Однако я получаю сообщение об ошибке: "Имя переменной диапазона может быть выведено только из простого или квалифицированного имени без аргументов." для элемента p (0).

Поэтому мой вопрос таков:

  1. Как я могу устранить эту ошибку?
  2. Как мне обработать результат (q) как тип IEnumerable?

Жизнь не стала проще, потому что я использую Linq на незнакомом vb.net. Многие примеры есть в C #, но я не встречал ничего подходящего даже в C #.

1 Ответ

1 голос
/ 22 декабря 2009

Решено: мне пришлось псевдоним возвращаемых столбцов.

Dim q = From p In dt
    Group p By transactionTypeName = p(0) _
    Into totalForType = Sum(Convert.ToDouble(p(1))) _
    Select transactionTypeName, totalForType

Также обратите внимание, что мне пришлось выполнить преобразование для суммируемого значения, потому что для динамически возвращаемой таблицы данных не был указан тип столбца.

Подсказка найдена здесь , потому что vb.net о, так услужливо выдает нам сообщение об ошибке, отличное от "Недопустимого объявления члена анонимного типа. Члены анонимного типа должны быть объявлены с назначением члена, простым именем или членский доступ. "

Для полноты результаты обрабатываются следующим образом:

For Each item In q ' no need for defining item as a type (in C# we'd use the var keyword)
    If item.totalForType = magicNumber Then
        'do something
    Else
        'do something else
    End If
Next
...