GroupBy 和 Sum 具有两个不同的时间段 - Linq

内幕人士

我需要在一行中获取不同时间段内我的产品数量的总和。

例如:

ID     Date       Amount
-------------------------
1     2017/01/01   10
1     2017/01/01   12
1     2017/04/03   5
2     2017/01/02   10

我需要得到每个产品的春季和夏季的总和,所以我们有产品 1 的总和:

ID     SumSpring    SumSummer
-----------------------------
1        22            5

我用过这个代码:

    var pDetails = ordersTotal.Select(g => new
                                {
                                    g.ProductID,
                                    DateType = (((String.Compare(g.BuyDate, "2017/01/01") >= 0 && String.Compare(g.BuyDate, "2017/03/30") <= 0)) ? "Spring" : "Summer"),
                                    g.Amount
                                }).GroupBy(x => new { id = x.ProductID, type = x.DateType }).Select(x => new
                                {
                                    ProductID = x.Key.id,
                                    SumSpring = (x.Where(z => z.DateType == "Spring").Count() == 0 ? 0 : x.Where(z => z.DateType == "Spring").Sum(z => z.Amount)),
                                    SumSummer = (x.Where(z => z.DateType == "Summer").Count() == 0 ? 0 : x.Where(z => z.DateType == "Summer").Sum(z => z.Amount)),
                                });

但它为每个产品返回几行,这不是我所期望的,我不知道为什么!

这是一种产品的输出:

ID     SumSpring    SumSummer
-----------------------------
1        22            0
1        0             5

一种产品两行,但应该是一排!

蒂姆·施梅尔特

您可以通过这种方式获得一年的季度:

int quarter = (month + 2) / 3;

但是不要将它包含在 中GroupBy,您只想分组ProductID

var pDetails = ordersTotal.Select(x => new
{
    x.ProductID,
    x.Amount,
    Quarter = (x.BuyDate.Month + 2) / 3
})
.Where(x => x.Quarter == 1 || x.Quarter == 2)  // it seems you only want these
.GroupBy(x => x.ProductID)
.Select(g => new
{
    ProductID = g.Key,
    SumSpring = g.Where(x => x.Quarter == 1)
                 .Select(x => x.Amount)
                 .DefaultIfEmpty(0)
                 .Sum(),
    SumSummer = g.Where(x => x.Quarter == 2)
                 .Select(x => x.Amount)
                 .DefaultIfEmpty(0)
                 .Sum()
});

请注意,此查询不关心年份。但你似乎并不在意它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章