Saya mendapatkan data dari db seperti ini:

enter image description here

Nanti saya kelompokkan jadi sepertinya

Month 6
Week 2
Amount 228

Dan seterusnya..

Berikut kodenya:

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

Seperti yang Anda lihat untuk Bulan 6 hanya ada data untuk minggu 2. Dan itu berkelompok dan berfungsi seperti yang diharapkan, tetapi sekarang saya bertanya-tanya bagaimana saya bisa menambahkan objek kosong dengan jumlah 0 untuk minggu yang hilang.

Misalnya jika hanya ada minggu 2, mari tambahkan data dengan jumlah 0 untuk minggu 1,3 dan 4.

Pada contoh Bulan 8, karena ada minggu 2 dan 3 saya harus menambahkan minggu 1 dan 4 dengan jumlah 0.

Bagaimana saya bisa mencapai ini?

Terima kasih teman-teman

Bersulang

0
Roxy'Pro 19 September 2019, 17:38

1 menjawab

Jawaban Terbaik

Jika Anda ingin entri per minggu dalam setahun, Anda harus membuatnya entah bagaimana. Anda dapat melihat jawaban ini dan memodifikasinya sedikit sesuai dengan kebutuhan Anda.

Sesuatu seperti ini:

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);
}
1
mm8 19 September 2019, 15:15