首页 > 解决方案 > C# Linq - 对已经分组的数据进行分组

问题描述

我已经对现在看起来像这样的数据进行了分组:

<tr>
    <th>Id</th>
    <th>Type</th>
    <th>Amount</th>
</tr>
<tr>
    <td>1</td>
    <td>Delivered</td>
    <td>100</td>
</tr>
<tr>
    <td>2</td>
    <td>Sent</td>
    <td>150</td>
</tr>
<tr>
    <td>3</td>
    <td>Received</td>
    <td>110</td>
</tr>
<tr>
    <td>4</td>
    <td>Delivered</td>
    <td>79</td>
</tr>
<tr>
    <td>5</td>
    <td>Sent</td>
    <td>30</td>
</tr>

这是我如何得到它的代码:

var query = await _context.product.AsNoTracking().Where(x => (x.productDate.Date >= DateTime.Now.AddDays(-30) && x.productDate.Date <= DateTime.Now.Date).ToListAsync();

if (query == null) return null;

var data = query.GroupBy(x => x.productStatusId)
           .Select(product => new productsChartDTO
           {    
               Type =
                (
                    product.FirstOrDefault().productStatusId == (int)Enums.productStatus.Delivered || product.FirstOrDefault().productStatusId == (int)Enums.productStatus.InProcess ? "Delivered" :
                    product.FirstOrDefault().productStatusId == (int)Enums.productStatus.Sent || product.FirstOrDefault().productStatusId == (int)Enums.productStatus.InProcess ? "Sent" :
                    product.FirstOrDefault().productStatusId == (int)Enums.productStatus.Received ? "Received" : "Unknown"
                ),
               Amount = product.Sum(x => x.Amount)
           });  
return data;

可以看到伙计们,即使我按 分组productStatusId,如果productStatus在 ' InProcess' 或在 ' Delivered' 中,就会有类型“ Delivered”,所以在这个查询之后,我看到的结果Delivered是我在示例中发布的两次“”。

我认为在这次执行之后我应该再次对数据进行分组?

我怎么能做到这一点?

是否可以继续对这个查询进行分组,或者应该有另一个会再次分组?

谢谢

干杯

标签: c#linqgroup-by

解决方案


只需将您的逻辑移动到该GroupBy方法并返回一个类型string而不是int从中返回一个类型:

var data = query
    .GroupBy(x => x.productStatusId == (int)Enums.productStatus.Delivered || x.productStatusId == (int)Enums.productStatus.InProcess ? "Delivered" :
                x.productStatusId == (int)Enums.productStatus.Sent || x.productStatusId == (int)Enums.productStatus.InProcess ? "Sent" :
                x.productStatusId == (int)Enums.productStatus.Received ? "Received" : "Unknown")
    .Select(product => new productsChartDTO
    {
        Type = product.Key,
        Amount = product.Sum(x => x.Amount)
    });

推荐阅读