【问题标题】:How can I add to my list empty objects based on week number如何根据周数将空对象添加到我的列表中
【发布时间】:2019-09-19 23:15:36
【问题描述】:

我正在像这样从 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。

我怎样才能做到这一点?

谢谢大家

干杯

【问题讨论】:

  • 旧电话中继问题。贝尔电话科学家致力于确定公司用于确定所需中继线数量的最大电话数量。所以解决方案是创建一个30秒间隔的表格,然后填写表格。您需要这样做以确保每个时期都有一个表格条目。因此,您需要为 6 个月期间的每一周创建一个包含一行的表。然后用数据填写表格。没有添加数据的行是没有条目的周。
  • 这应该有助于创建不同日期的列表...对于那些...您需要按周值分组...并将其合并到您的数据集以获取零.. .stackoverflow.com/questions/3738748/…
  • 所以您总是希望yas 包含 52 或 53 个条目,一年中的每周一个?
  • @mm8 是的,我总是想要 1 个月的 4 个条目,即使数据库值仅存在 1 周和 3 周,例如我想要 2. 和 4. 周的空值 :)
  • 每周一得到:DateTime startDate = DateTime.Parse("1/7/19"); //一年中的第一个星期一 DateTime endDate = DateTime.Parse("6/7/19"); DateTime[] mondays = Enumerable.Range(0, ((endDate - startDate).Days / 7) + 1).Select((x, i) => startDate.Date.AddDays(7 * i)).ToArray() ;

标签: c# linq group-by entity-framework-core


【解决方案1】:

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

类似这样的:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2021-10-16
    • 2021-05-31
    • 2023-03-31
    • 2017-11-25
    相关资源
    最近更新 更多