You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:24:23