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; }
}
如何在 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; }
}