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

问题描述 投票:0回答:1

我想使用 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 查询才能访问费用总和?

c# linq datatable
1个回答
47
投票

这非常简单 - 只需在组上使用

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"))
                  };
© www.soinside.com 2019 - 2024. All rights reserved.