Как я могу добавить в свой список пустые объекты на основе номера недели - PullRequest
0 голосов
/ 19 сентября 2019

Я получаю данные из БД следующим образом:

enter image description here

Позже я сгруппирую их так, чтобы они выглядели как

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, давайте добавим данные с количеством 0 для недель 1,3 и 4.

В примере с 8-м месяцем, потому что есть недели 2 и 3, я должен добавить недели 1 и 4 с количеством 0.

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

Спасибо, ребята

Приветствия

1 Ответ

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

Если вам нужна запись в неделю в году, вам нужно как-то ее создать.Вы можете взглянуть на этот ответ и немного изменить его в соответствии с вашими требованиями.

Примерно так:

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