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

如何使用Entity Framework查询同表中满足特定状态序列的Denied人员记录

解决EF Code-First查询特定状态流转的Denied记录问题

我明白你的需求啦——要找出那些最终状态是Denied,而且同一人员经历过"FirstCheck Approved"和"Security Check"流程的记录。这可以通过EF的Any()方法来实现,针对同一个PersonNumber检查其他状态的存在性。

最终查询代码

var denialPersons = await db.ArrivalStatusLogs
    .Where(s => s.Status == "Denied"
                // 检查同一人员存在FirstCheck Approved记录
                && db.ArrivalStatusLogs.Any(sc => sc.PersonNumber == s.PersonNumber 
                                                  && sc.Status == "FirstCheck Approved")
                // 检查同一人员存在Security Check记录
                && db.ArrivalStatusLogs.Any(sc => sc.PersonNumber == s.PersonNumber 
                                                  && sc.Status == "Security Check"))
    .Select(x => x.PersonNumber)
    .Distinct() // 可选:避免同一PersonNumber出现多次重复结果
    .ToListAsync();

代码逻辑说明

  • 外层Where先锁定所有Status为"Denied"的记录
  • 第一个Any()确保当前人员(同一PersonNumber)存在"FirstCheck Approved"的状态记录
  • 第二个Any()确保当前人员存在"Security Check"的状态记录
  • 添加Distinct()是因为同一个人员可能有多条Denied记录,去重后得到唯一的人员编号列表

如果需要获取完整的Denied日志记录

如果你不只是需要PersonNumber,而是要完整的ArrivalStatusLog实体,只需要修改Select部分:

var denialLogs = await db.ArrivalStatusLogs
    .Where(s => s.Status == "Denied"
                && db.ArrivalStatusLogs.Any(sc => sc.PersonNumber == s.PersonNumber 
                                                  && sc.Status == "FirstCheck Approved")
                && db.ArrivalStatusLogs.Any(sc => sc.PersonNumber == s.PersonNumber 
                                                  && sc.Status == "Security Check"))
    .ToListAsync();

这种方式利用EF的关联查询能力,直接在数据库层面完成筛选,性能也比较高效,不需要把所有数据拉到内存再过滤~

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:43:15