使用LINQ对DataTable中的数据进行分组

bit*_*ler 9 c# linq datatable

我想使用LINQ对DataTable中的数据进行分组(列:userid,chargetag,charge).

内容可能如下所示:

userid    chargetag    charge
-----------------------------
user1     tag3         100
user2     tag3         100
user3     tag5         250
Run Code Online (Sandbox Code Playgroud)

结果我需要这样的东西:

chargetag    count    sum
-------------------------
tag3         2        200
tag5         1        250
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

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,
                  };
Run Code Online (Sandbox Code Playgroud)

我可以提取出收据标签的名称和号码.我如何更改LINQ查询以访问费用总和?

提前致谢 :-)

问候,凯文

Jon*_*eet 38

这很简单 - 只需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"))
                  };
Run Code Online (Sandbox Code Playgroud)

(我已经删除了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"))
                  };
Run Code Online (Sandbox Code Playgroud)

或者用一个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"))
                  };
Run Code Online (Sandbox Code Playgroud)