无法从实体框架的引用表中检索数据

Posted

技术标签:

【中文标题】无法从实体框架的引用表中检索数据【英文标题】:Unable to retrieve data from reference table from Entity Framework 【发布时间】:2021-09-15 06:53:10 【问题描述】:

我有三个表,joborderjoborder itemsworkorder

joborder 是父表,joborderitem 是子表。 workorder 有一个 joborder item id 作为 joborder item 表的外键。

我需要在workorder 中不存在其joborderid 的joborderitems。 workorder 将基于jobordrritem 创建.. 所以请指导我如何获得这些项目?

模型类:

public JobOrder()

    JobOrderGuid = Guid.NewGuid();
    Weight = 0;


public Guid JobOrderGuid  get; set; 
public string JobOrderNumber  get; set; 
public int OrderStatusId  get; set; 
public bool IsDeleted  get; set; 
public int? UQCId  get; set;   // Future  purpose
public decimal? Weight  get; set;  // Future  purpose

public virtual IList<JobOrderItem> JobOrderItems  get; set; 

#region Custom properties

/// <summary>
/// Gets or sets the order status
/// </summary>
public OrderStatus OrderStatus

    get => (OrderStatus)OrderStatusId;
    set => OrderStatusId = (int)value;

        
#endregion


public class JobOrderItem : BaseEntity

    public int JobOrderId  get; set; 
    public int SNo  get; set; 
    public int ProductId  get; set; 
    public decimal OrderQuantity  get; set; 
    public decimal ReceivedQuantity  get; set; 
    public decimal? ItemWeight  get; set; 
    public bool IsReceived  get; set; 
    public string Details  get; set; 

    public virtual JobOrder JobOrder  get; set; 
    public virtual Product Product  get; set; 


public class WorkOrder : BaseEntity

    public WorkOrder()
    
        WorkOrderGuid = Guid.NewGuid();
    

    public Guid WorkOrderGuid  get; set; 
    public string WorkOrderNumber  get; set; 
    public int JobOrderItemId  get; set;   // REFERENCE ID 
    public string Details  get; set;      
    public DateTime WorkStartDate  get; set; 
    public DateTime? WorkCompletedDate  get; set; 

    public virtual JobOrderItem JobOrderItem  get; set; 
    public virtual IList<WorkOrderStateInfo> WorkOrderStateInfo  get; set; 
    public virtual IList<WorkOrderItem> WorkOrderItems  get; set; 

查询:

var result = _context.JobOrders
                     .Include(x => x.JobOrderItems) .....??

请指导我如何返回未在任何工作订单中使用的订单项列表 .. 提前致谢

【问题讨论】:

你是哪个EF版本(请加标签)。 格特·阿诺德 ..done 如果您无法升级到 EF-core 5,那么您需要一个解决方法,f/e ***.com/a/16801205/861716 @GertArnold,已过滤的 Include 与此问题无关。 @SvyatoslavDanyliv 不确定。这个问题不是 100% 清楚的。 【参考方案1】:

Include不是查询数据,而是加载相关数据。使用LEFT JOIN 进行简单的 LINQ 查询可以解决您的问题。

var withoutWorkOrder = 
    from ji in context.JobOrderItems
    join wo in context.WorkOrders on ji.Id equals wo.JobOrderItemId into gj
    from wo in gj.DefaultIfEmpty()
    where (int?)wo.Id == null
    select ji;

【讨论】:

以上是关于无法从实体框架的引用表中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

正在加载引用另一个表中相关数据的数据列表

分页和实体框架

如何从使用实体框架的外键链接的多个表中获取所有数据?

使用 LINQ 和实体框架在一个 SQL 查询中从多个表中提取数据

实体框架返回零结果

使用实体框架从数据库中检索值