LINQ左连接场景下判断关联表是否存在可跳过周末的缺失行实现方案
解决方案
首先修正原查询框架的笔误:左连接后关联的Table2数据已命名为leftjoinvar,原group语句中的t2需要替换为leftjoinvar,否则会触发编译错误。
完整实现代码
from t1 in table1 join t2 in table2 on t1.ID equals t2.ID into temp from leftjoinvar in temp.DefaultIfEmpty() group new {t1, leftjoinvar} by new {t1.FoodID} into g select new myVM { theFoodName = g.Key.FoodID, isRowMissingForTheFoodName = (() => { // 取当前品类对应的统计起始日期 DateTime startDt = DateTime.Parse(g.First().t1.StartDate); // 提取当前品类所有有效统计日期,排除Till Today特殊行 var existDates = g.Select(x => x.leftjoinvar?.Date) .Where(d => d != null && d != "Till Today") .Select(d => DateTime.Parse(d)) .Distinct() .ToList(); // 无任何有效统计行直接判定为缺失 if (!existDates.Any()) return false; // 取最大有效日期作为统计区间的结束节点 DateTime endDt = existDates.Max(); // 计算统计区间内的工作日总数(自动排除周六周日) int workDayCount = Enumerable.Range(0, (endDt - startDt).Days + 1) .Select(offset => startDt.AddDays(offset)) .Count(d => d.DayOfWeek is not DayOfWeek.Saturday and not DayOfWeek.Sunday); // 实际统计行数和所需工作日数相等则无缺失,返回true return existDates.Count == workDayCount; })() }
注意事项
- 该逻辑默认适配所有周末的跳过规则,不需要对特定日期做硬编码
- 自动根据每个品类的起始日期计算统计范围,无需提前预设全局区间
- 对Table2的重复日期做了去重处理,避免脏数据导致判断错误
- 如果你是用EF Core做数据库查询,建议先将关联数据加载到内存后再执行分组判断,避免EF无法解析表达式抛出异常。
内容的提问来源于stack exchange,提问作者devMe
相关产品推荐
相关产品推荐

