【问题标题】:C# Linq - Group allready grouped dataC# Linq - 对已分组的数据进行分组
【发布时间】:2019-09-20 08:49:55
【问题描述】:

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

<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' 中,就会有Type "Delivered",所以在此之后询问 我在示例中发布了两次“Delivered”类型的结果。

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

我怎样才能做到这一点?

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

谢谢

干杯

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    只需将您的逻辑移至 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)
        });
    

    【讨论】:

    • 非常感谢您的慷慨帮助!如果我不想返回“未知”类型怎么办。它作为数据的一部分存在于数据中,但我只想返回“Uknown”以外的其他类型。我只想看到“已交付”、“已发送”、“已接收”。使用这种方法可以实现吗?
    • @Roxy'Pro:在对GroupBySelect 的调用之间添加.Where(g =&gt; g.Key != "Unknown")?这应该过滤掉“未知”组。
    • 你是个好人 :) 是的,我做到了,你怎么把 C# 学得这么好?非常感谢!
    【解决方案2】:

    代替

    .GroupBy(x => x.productStatusId)
    

    .GroupBy(x => {
    if (new [] { (int)Enums.productStatus.InProcess, (int)Enums.productStatus.Delivered }.Contains(x.productStatusId) {
      return "Delivered";
    } else if ((int)Enums.productStatus.Sent == x.productStatusId) { // Note: your code had 'InProcess' twice
      return "Sent";
    } else if ((int)Enums.productStatus.Received == x.productStatusId) {
      return "Received";
    }
    
    return "Unknown";
    })
    

    【讨论】:

    • o.0 会尽快尝试1
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多