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以这样一种不遗余力的方式回答了这个问题。。你很好,很公平。请查看我的答案以获得可能的解决方案。检查此问题,伙计,谢谢回答!