Entity Framework Core - 如何在 EF 中使用自定义(一对一)查询 include/populate 导航 属性?

Entity Framework Core - How to include/populate a navigation property with custom(1-to-1) query in EF?

如何在 EF 中使用自定义(一对一)查询 include/populate 导航 属性?

例如

public class Item {
     public int Id { get; set; }
     public string Name { get; set; }

     [ForeignKey("Id")]
     public ItemCost LatestCost {get; set; }
}

public class ItemCost {
    public int Id { get; set; }
    public DateTime From { get; set; }
    public DateTime? To { get; set; }
    public decimal Cost { get; set; }
}

目标是用 ItemCosts 中的最新成本填充 Item 的 LatestCost 属性。这是如何使用 EF 完成的,或者您对此有何看法?

是否可以在 .Include/.ThenInclude 方法中进行自定义查询? 例如

.ThenInclude(a => { a.LatestCost = (from a _db.ItemCosts 
                                    where... select a).SingleOrDefault() })...

您可以使用虚拟 get-only 属性。您的导航 属性 应该是 ICollection<ItemCost>。在此示例中,我假设 ItemCost class 中的 Id 属性 是相关 Item 的 ID,但不清楚。提示:使用 nameof(property) 而不是硬编码 属性 名称将允许编译器在您出于某种原因更改名称时捕获错误。 [NotMapped] 属性告诉 Entity Framework 不要尝试将 属性 映射到数据库字段。

public class Item {
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<ItemCost> ItemCosts {get; set; }

    [NotMapped]
    public virtual ItemCost LatestCost
    {
        get
        {
            return ItemCosts.OrderByDescending(x => x.From).FirstOrDefault();
        }
    }
}

public class ItemCost {
    public int Id { get; set; }
    public DateTime From { get; set; }
    public DateTime? To { get; set; }
    public decimal Cost { get; set; }

    [ForeignKey(nameof(Id))]
    public virtual Item Item { get; set; }
}