Entity Framework查询参考表失败,如何获取未关联WorkOrder的JobOrderItem
查询未关联WorkOrder的JobOrderItem实现方案
你可以通过以下两种方式实现需求,两种写法都会被EF Core翻译为高效的SQL语句执行:
方式1:直接从JobOrderItem表查询(推荐)
如果你最终需要返回的是JobOrderItem列表,直接从子表查询逻辑更简洁:
var unusedJobOrderItems = await _context.JobOrderItems // 若需要关联父工单的字段可保留Include,不需要可删除 .Include(item => item.JobOrder) // 筛选条件:不存在任何关联的WorkOrder记录 .Where(item => !_context.WorkOrders.Any(workOrder => workOrder.JobOrderItemId == item.Id)) // 可选:额外筛除已删除的父工单对应子项 .Where(item => !item.JobOrder.IsDeleted) .ToListAsync();
方式2:从JobOrder父表出发查询
如果你需要保留从JobOrder表开始查询的写法,可通过SelectMany拉平符合条件的子项:
var result = await _context.JobOrders .Include(jobOrder => jobOrder.JobOrderItems) // 可选:只查询未删除的有效工单 .Where(jobOrder => !jobOrder.IsDeleted) .SelectMany(jobOrder => jobOrder.JobOrderItems // 筛选没有关联WorkOrder的子项 .Where(item => !_context.WorkOrders.Any(wo => wo.JobOrderItemId == item.Id)) ) .ToListAsync();
可选优化
如果你在JobOrderItem模型类中添加反向导航属性:
public class JobOrderItem : BaseEntity { // 原有属性不变 // 新增WorkOrder反向导航 public virtual IList<WorkOrder> WorkOrders { get; set; } }
查询写法可以进一步简化:
var unusedJobOrderItems = await _context.JobOrderItems .Include(item => item.JobOrder) .Where(item => !item.WorkOrders.Any()) .ToListAsync();
内容的提问来源于stack exchange,提问作者Ram R
相关产品推荐
相关产品推荐

