使用多列分组,然后使用方法语法对特定列求和

Posted

技术标签:

【中文标题】使用多列分组,然后使用方法语法对特定列求和【英文标题】:Grouping using multiple columns, then summing a specific column using method syntax 【发布时间】:2019-12-15 05:35:34 【问题描述】:

目前我正在寻找一种方法来从可枚举中获取所有片数的总和,同时忽略重复项,所有这一切都是在使用方法语法的同时进行的。就目前情况而言,我的代码可以正常工作,但我意识到这只是暂时的。稍后会详细介绍。

我们以下面的类为例

internal class Piece

    public int Count  get; set; 
    public DateTime Date  get; set; 
    public string Description  get; set;    

然后使用这个类创建一个包含以下信息的列表

List<Piece> pieces = new List<Piece>

    new Piece(41,DateTime.Parse("2019-07-12"),"BB"),
    new Piece(41,DateTime.Parse("2019-07-12"),"BB"),
    new Piece(21,DateTime.Parse("2019-07-12"),"JP"),
    new Piece(23,DateTime.Parse("2019-07-14"),"AA")
;

为了总结,我想出了以下内容

int total = pieces.Where(x => x.Count > 0)
                  .GroupBy(x => x.Count, x => x.Date, 
                           (piece, date) => new  Count = piece,Date = date)
                  .Sum(x => x.Count);

这就是事情变得棘手的地方。如果要添加另一块,如下所示

new Piece(23,DateTime.Parse("2019-07-14"),"AB") 

由于我的分组方式,该部分将被忽略。这远非理想。

我找到了以下按几列分组的方法

GroupBy( x => new x.Count,x.Date,x.Description)

但我没有办法做到这一点,所以我可以在这个分组上使用 Sum。这种使用 AnonymousType 的分组不允许我声明局部变量 (piece,date),就像我在之前的 GroupBy 中所做的那样(据我所知)。 目前,我拥有的代码可以解决问题,但情况不再如此只是时间问题。

一些额外的细节。

我正在使用 Razor 处理查询结果,但我无法控制从服务器获取的数据。使用 linq 操作数据基本上是我目前唯一的方法。

非常感谢任何帮助

【问题讨论】:

【参考方案1】:

对于计数,您只需要此查询:

int total = pieces
    .Where(x => x.Count > 0)
    .GroupBy(x => new  x.Count, x.Date, x.Description )
    .Sum(g => g.Key.Count);

因此您可以访问分组的所有关键属性。

这将为您的初始样本返回 85,如果您添加新样本,则返回 108。

【讨论】:

据我了解,您需要按 broup 求和,而不是总计:C# pieces.Where(x =&gt; x.Count &gt; 0) .GroupBy(x =&gt; new x.Count, x.Date, x.Description ) .Select(x =&gt; new obj = x.Key, GroupingSum= x.Sum(s =&gt; s.Count)); 我附上图片来解释它是如何分组的 感谢@Tim Schmelter。我实际上正在研究该 Key 属性实际上做了什么,但你肯定比我做得好!

以上是关于使用多列分组,然后使用方法语法对特定列求和的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用 Python 对特定列进行分组来求和?

SQL 中多列“级联”约束的优雅语法?

如何对sql查询引用组中的多列求和

对集合多列进行求和方法的选择

根据不同的条件对两个不同的列进行分组和求和

GroupBy 多列作为键并对多列求和,如 sql?