如何编写LINQ查询统计指定日期小时块内的同时活跃作业数量
问题背景
- 现有作业管理数据库,
PostOne为主表,通过外键关联全部支撑表,PostThr表用于存储作业调度相关记录。 PostThr表共包含5个字段:- ID:记录主键
- FK:关联的作业ID(外键字段)
- ThrDate:
DateTime类型,存储调度事件对应的日期 - ThrTime:
TimeSpan类型,存储调度事件对应的时间点 - ThrText:
string类型,固定取值仅为"CONFIRM START"(标记作业开始)、"CONFIRM END"(标记作业结束)
- 已知业务约束:所有作业运行时长不超过1个自然日,不存在跨夜运行的情况。
需求目标
传入指定日期、指定时间点参数,统计该时间点处于活跃状态的唯一作业总数。活跃判定规则:作业的开始时间小于等于给定时间,且作业的结束时间大于等于给定时间。查询要求使用LINQ实现。
传入参数示例:
DateTime givenDate = DateTime.Parse("7/15/22"); TimeSpan givenTime = TimeSpan.Parse("9:00");
实现代码
实现逻辑:首先筛选指定日期的所有作业开始记录,关联同作业、同日期的结束记录,过滤掉缺失成对开始/结束记录的异常数据后,按时间规则筛选符合条件的作业,去重后计数即可。
// 若使用EF Core,将PostThr替换为DbContext中对应的DbSet属性即可 var activeJobCount = ( from startRecord in PostThr // 过滤指定日期的所有开始记录 where startRecord.ThrDate.Date == givenDate.Date && startRecord.ThrText == "CONFIRM START" // 关联匹配同作业同日期的结束记录 join endRecord in PostThr on new { startRecord.FK, Date = startRecord.ThrDate.Date } equals new { endRecord.FK, Date = endRecord.ThrDate.Date } into endRecordMatches from matchedEnd in endRecordMatches.DefaultIfEmpty() // 排除无匹配结束记录的脏数据 where matchedEnd != null && matchedEnd.ThrText == "CONFIRM END" // 按时间规则筛选:开始早于等于给定时间,结束晚于等于给定时间 where startRecord.ThrTime <= givenTime && matchedEnd.ThrTime >= givenTime select startRecord.FK ).Distinct().Count();
注:由于业务明确无跨夜作业,无需处理跨日期的时间偏移计算,直接按同日期匹配开始/结束记录即可。如果后续新增跨夜作业支持,仅需调整关联时的日期匹配规则与时间比较逻辑即可适配。
内容的提问来源于stack exchange,提问作者Nick Fleetwood
相关产品推荐
相关产品推荐

