Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用linq对缺少的值进行分组和计数_Linq_Asp.net Core_Chart.js - Fatal编程技术网

如何使用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

如何使用linq计算缺失的值。基本上,我是在计算某个月内发生的事件,如果该月没有条目,我希望计数显示为零

但是,当前如果该月没有条目,数组将跳过一个月,如下面的索引5所示。我不希望发生这种情况的原因是,我正在图表上绘制结果,因此从索引5开始跳过的日期与实际计数不同步

下面是我的linq查询

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