如何使用linq对缺少的值进行分组和计数
如何使用linq计算缺失的值。基本上,我是在计算某个月内发生的事件,如果该月没有条目,我希望计数显示为零 但是,当前如果该月没有条目,数组将跳过一个月,如下面的索引5所示。我不希望发生这种情况的原因是,我正在图表上绘制结果,因此从索引5开始跳过的日期与实际计数不同步 下面是我的linq查询如何使用linq对缺少的值进行分组和计数,linq,asp.net-core,chart.js,Linq,Asp.net Core,Chart.js,如何使用linq计算缺失的值。基本上,我是在计算某个月内发生的事件,如果该月没有条目,我希望计数显示为零 但是,当前如果该月没有条目,数组将跳过一个月,如下面的索引5所示。我不希望发生这种情况的原因是,我正在图表上绘制结果,因此从索引5开始跳过的日期与实际计数不同步 下面是我的linq查询 var veterans = _db.Records .Where(j => j.Requestor == "Veterans" && EF.Fu
var veterans = _db.Records
.Where(j => j.Requestor == "Veterans" && EF.Functions.DateDiffMonth(j.Request_Date, DateTime.Now) >= 0 && EF.Functions.DateDiffMonth(j.Request_Date, DateTime.Now) <= 24)
.GroupBy(g => new { g.Request_Date.Value.Year, g.Request_Date.Value.Month }).OrderBy(d => d.Key.Year).ThenBy(d => d.Key.Month)
.Select(group => new
{
Dates = group.Key,
Count = group.Count()
});
var veteransCount = veterans.Select(n => n.Count).ToArray();
var-veterans=\u db.Records
其中(j=>j.Requestor==“Veterans”和&EF.Functions.DateDiffMonth(j.Request\u Date,DateTime.Now)>=0和&EF.Functions.DateDiffMonth(j.Request\u Date,DateTime.Now)new{g.Request\u Date.Value.Year,g.Request\u Date.Value.Month}).OrderBy(d=>d.Key.Year).然后by(d=>d.Key.Month)
.选择(组=>新建
{
Dates=group.Key,
Count=group.Count()
});
var veteransCount=veterans.Select(n=>n.Count).ToArray();
您可以创建一个助手函数来生成所需的月+年枚举:
public static IEnumerable<(int Year,int Month)> MonthsInYears(int fromYear, int fromMonth, int toYear, int toMonth) {
for (int year = fromYear; year <= toYear; ++year)
for (int month = (year == fromYear ? fromMonth : 1); month <= (year == toYear ? toMonth : 12); ++month)
yield return (year, month);
}
或者,由于这是一种特殊情况,您可以为源数据创建一个字典
,并查找每个枚举值:
var veteransMap = veterans.ToDictionary(v => v.YearMonth, v => v.Count);
var veteransCount2 = monthsInYears.Select(ym => veteransMap.TryGetValue(new { ym.Year, ym.Month }, out var count) ? count : 0)
.ToArray();
注意:如果你想要完整的开始和结束年份,你可以用1和12来调用
MonthsInYears
方法,从开始到结束月份。只是一个粗略的草图:在代码中创建一个没有空白的“完整的空项列表”,使用真实数据进行分组。在select运算符中,第二个参数是一个列表,它要么包含一个实际数据元素,要么不包含任何内容。这取决于你的空项或真实数据项。哇,谢谢你这么深入的回答。早上我会试一试:)非常感谢你的帮助Hey NetMage这真是一次难得的款待,非常感谢
var veteransCount = monthsInYears.GroupJoin(
veterans,
ym => new { ym.Year, ym.Month },
v => v.YearMonth,
(ym, sj) => sj.FirstOrDefault()?.Count ?? 0)
.ToArray();
var veteransMap = veterans.ToDictionary(v => v.YearMonth, v => v.Count);
var veteransCount2 = monthsInYears.Select(ym => veteransMap.TryGetValue(new { ym.Year, ym.Month }, out var count) ? count : 0)
.ToArray();