C# 如何确保为每个id添加4个值

C# 如何确保为每个id添加4个值,c#,entity-framework,linq,group-by,C#,Entity Framework,Linq,Group By,我在和周玩。我从数据库中检索数据的方式如下: 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 Month 8 Week 1 Month 8 Week 2 Month 8 Week 3

我在和周玩。我从数据库中检索数据的方式如下:

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
 Month 8
 Week 1

 Month 8
 Week 2

 Month 8
 Week 3

 Month 8
 Week 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
 Month 8
 Week 1

 Month 8
 Week 2

 Month 8
 Week 3

 Month 8
 Week 4
正如我在图片右侧所写的那样,我正在对数据进行分组,它工作正常,最后看起来如下:

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
 Month 8
 Week 1

 Month 8
 Week 2

 Month 8
 Week 3

 Month 8
 Week 4
但我想实现下一个目标:

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

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
 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,那么让我们找出缺少的一个,并将它们添加到类似的值中

任何形式的帮助都会很棒


谢谢

也许有更干净的方法可以做到这一点,但这是可行的

    static void Main(string[] args)
    {
        var groupedData = new List<DemoObj>
            {
                new DemoObj { Amount = 11, Month = 1, Week = 1 },
                new DemoObj { Amount = 133, Month = 1, Week = 2 },
                new DemoObj { Amount = 323, Month = 1, Week = 3 },
                // Needs to add week 4
                new DemoObj { Amount = 2342, Month = 2, Week = 1 },
                // Needst to add week 2
                new DemoObj { Amount = 23433, Month = 2, Week = 3 }
                // Needs to add etc.. 
            };

        var fullData = AddMissingValues(groupedData);
    }

    private static IEnumerable<DemoObj> AddMissingValues(IEnumerable<DemoObj> valuesFromDb)
    {
        var results = valuesFromDb.ToList();
        var possibleMonths = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
        var possibleWeeks = new[] { 1, 2, 3, 4 };

        foreach (var possibleMonth in possibleMonths)
        {
            foreach (var possibleWeek in possibleWeeks)
            {
                if (results.Any(x => x.Month == possibleMonth && x.Week == possibleWeek) == false)
                {
                    results.Add(new DemoObj { Month = possibleMonth, Week = possibleWeek });
                }
            }
        }

        return results.OrderBy(x => x.Month).ThenBy(x => x.Week);
    }

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

您可以按月分组,然后创建ProductsChardto[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);

这个问题和你的问题有什么不同?@mm8-previous是一整年的问题,你提供了答案,这里我想要一些类似的东西,但只针对在数据中返回的月份。如果是3个月,那就让我们来填补这3个月里缺失的几周。。谢谢你们mm8以这样一种不遗余力的方式回答了这个问题。。你很好,很公平。请查看我的答案以获得可能的解决方案。检查此问题,伙计,谢谢回答!