首页 > 解决方案 > 如何根据周数将空对象添加到我的列表中

问题描述

我从 db 中获取数据,如下所示:

在此处输入图像描述

后来我将它们分组,所以看起来像

Month 6
Week 2
Amount 228

等等..

这是代码:

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

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

正如您在第 6 个月看到的那样,只有第 2 周的数据。它是按预期分组和工作的,但现在我想知道如何添加数量为 0 的空对象来表示缺少的周数。

例如,如果只有第 2 周,让我们为第 1、3 和 4 周添加数量为 0 的数据。

在第 8 个月的示例中,因为有第 2 周和第 3 周,我应该添加第 1 周和第 4 周,数量为 0。

我怎么能做到这一点?

多谢你们

干杯

标签: c#linqgroup-byentity-framework-core

解决方案


如果您想要一年中的每周一个条目,您需要以某种方式创建这些条目。您可以查看答案并根据您的要求对其进行一些修改。

像这样的东西:

DateTime jan1 = new DateTime(DateTime.Today.Year, 1, 1);
//beware different cultures, see other answers
DateTime startOfFirstWeek = jan1.AddDays(1 - (int)(jan1.DayOfWeek));
Dictionary<int, productsDemoObject> allWeeks =
Enumerable
    .Range(0, 54)
    .Select(i => new {
        weekStart = startOfFirstWeek.AddDays(i * 7)
    })
    .TakeWhile(x => x.weekStart.Year <= jan1.Year)
    .Select(x => new {
        x.weekStart,
        weekFinish = x.weekStart.AddDays(4)
    })
    .SkipWhile(x => x.weekFinish < jan1.AddDays(1))
    .Select((x, i) => new productsDemoObject
    {
        Week = i + 1,
        Month = x.weekStart.Month,
        Amount = 0
    })
    .ToDictionary(x => x.Week, x => x);

foreach(var week in yas
    .GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.PaymentDate ?? DateTime.UtcNow, CalendarWeekRule.FirstDay, DayOfWeek.Monday)))
{
    allWeeks[week.Key].Amount = week.Sum(x => x.Amount);
}

推荐阅读