c# - 如何确保为每个id添加了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
但我想实现下一个:
检查一个月内是否没有全部 4 周,例如值为 8 的月份,让我们添加缺少的周,即使那将是空对象,填充周值就足够了,因此最终值将如下所示:
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 的值),让我们找出缺少哪个并让它们添加类似的东西。
任何形式的帮助都会很棒
谢谢
解决方案
您可以按月分组,然后productsChartDTO[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);
推荐阅读
- android - Android 在哪里存储动态模块 APK?
- bootstrap-4 - 如何在 Bootstrap-4 模态对话框中创建固定位置列
- mysql - 如何编写带有数量单位转换的分组查询SQL?
- arrays - 如何将 2 个相等长度的数组合并到一个带有键的字典中:Godot 中的值对?
- javascript - 当我通过 onchange 事件选择时,我可以在函数外使用变量吗
- javascript - 为什么'I'会在不同的函数中改变嵌套循环?
- python - 为什么设置默认参数然后在python中运行if语句?
- reactjs - React 组件中的共享时钟与内部时钟
- java - JGraphX。更改边缘的厚度或直径
- c# - 如何从 C# 代码在同一会话中执行两个依赖的 odata url