Используйте LINQ для группировки данных из DataTable

Я хочу использовать 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,
                  };

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

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

С уважением, Кевин!--4-->

1 ответов


это довольно просто - просто используйте 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"))
                  };