首页 > 解决方案 > 如何确保为每个id添加了4个值

问题描述

我在玩“周”。我以这样的方式从数据库中检索数据:

在此处输入图像描述

我在 c# 中的对象如下所示:

public class DemoObj
{
 public decimal Amount { get; set; }
 public int Month { get; set; }
 public int Week { get; set; }
}

我正在对图像右侧的数据进行分组,它工作正常,最后看起来像这样:

Month 6
Week 2

Month 8
Week 2

Month 8
Week 3

但我想实现下一个:

检查一个月内是否没有全部 4 周,例如值为 8 的月份,让我们添加缺少的周,即使那将是空对象,填充周值就足够了,因此最终值将如下所示:

 Month 8
 Week 1

 Month 8
 Week 2

 Month 8
 Week 3

 Month 8
 Week 4

因此,检查值 8 是否没有全部 4 周,如果没有,则让我们添加缺失的 ..

这是我当前的代码:

var query = await _context.product
                     .AsNoTracking()
                     .Where(x => (x.PaymentDate != null && x.PaymentDate > DateTime.UtcNow.AddMonths(-4))).ToListAsync();


var groupedData = query.GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.PaymentDate ?? DateTime.UtcNow, CalendarWeekRule.FirstDay, DayOfWeek.Monday))
    .Select(product => new productsChartDTO
    {
        Week = GetWeekNumberOfMonth(product.FirstOrDefault().PaymentDate.Value),
        Amount = product.Sum(x => x.Amount),
        Month = product.FirstOrDefault().PaymentDate.Value.Month
    });

因此,仅对于返回的月份,如果不是全部 4 周(值为 1、2、3、4 的值),让我们找出缺少哪个并让它们添加类似的东西。

任何形式的帮助都会很棒

谢谢

标签: c#entity-frameworklinqgroup-by

解决方案


您可以按月分组,然后productsChartDTO[4]为每周创建一个条目:

var groupedData = query.GroupBy(x => (x.PaymentDate ?? DateTime.UtcNow).Month)
    .Select(month =>
    {
        var weeks = Enumerable.Range(1, 4).Select(x => new productsChartDTO() { Month = month.Key, Week = x, Amount = 0 }).ToArray();
        foreach (var date in month)
        {
            int week = GetWeekNumberOfMonth(date.PaymentDate ?? DateTime.UtcNow);
            weeks[week - 1].Amount += date.Amount;
        }
        return weeks;
    })
    .SelectMany(x => x);

推荐阅读