Используйте LINQ для группировки данных из DataTable - PullRequest
9 голосов
/ 30 сентября 2010

Я хочу использовать LINQ для группировки данных из DataTable (столбцы: userid, chargetag, charge).

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

userid    chargetag    charge
-----------------------------
user1     tag3         100
user2     tag3         100
user3     tag5         250

Мне нужно что-то вродеэто в результате:

chargetag    count    sum
-------------------------
tag3         2        200
tag5         1        250

Это то, что у меня есть до сих пор:

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  let count = g.Count()
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = count,
                  };

Я могу извлечь имя метки заряда и ее номер.Как мне изменить запрос LINQ, чтобы получить доступ к сумме сборов?

Заранее спасибо: -)

С уважением, Кевин

1 Ответ

37 голосов
/ 30 сентября 2010

Это довольно просто - просто используйте метод расширения Sum для группы.

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = g.Count(),
                      ChargeSum = g.Sum(x => x.Field<int>("charge"))
                  };

(здесь я удалил предложение let, так как оно на самом деле ничего вам не покупало).

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

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  select new
                  {
                      ChargeTag = g.Key,
                      List = g.ToList(),
                  } into g
                  select new 
                  {
                      g.ChargeTag,
                      Count = g.List.Count,
                      ChargeSum = g.List.Sum(x => x.Field<int>("charge"))
                  };

Или с помощью предложения let:

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  let list = g.ToList()
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = list.Count,
                      ChargeSum = list.Sum(x => x.Field<int>("charge"))
                  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...