C # Linq - группировка уже сгруппированных данных - PullRequest
0 голосов
/ 20 сентября 2019

Я сгруппировал данные, которые теперь выглядят следующим образом:

<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"дважды, как я написал в примере.

Я думаю, что после этого выполнения я должен снова сгруппировать данные?

Как мне этого добиться?

Можно ли продолжить группировку по этому запросу или должен быть другой, который бы снова группировал?

Спасибо

Приветствия

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Просто переместите свою логику в метод 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)
    });
0 голосов
/ 20 сентября 2019

Вместо

.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";
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...