在实体内显式加载相关实体
Posted
技术标签:
【中文标题】在实体内显式加载相关实体【英文标题】:Explicitly load related entities within entities 【发布时间】:2014-01-16 11:38:59 【问题描述】:我有如下对象图:
Public ClassA
public int Id get; set;
public virtual ICollection<ClassB> ClassB_List get; set;
Public ClassB
public int Id get; set;
public virtual ICollection<ClassC> ClassC_List get; set;
Public ClassC
public int Id get; set;
现在我想做的是,因为我在 DBContext 级别禁用了延迟加载,对于给定的 ClassA 实例,我想加载所有相关实体(ClassBList 和 ClassCList)。 我可以使用以下方法加载 ClassB_List 的嵌套集合:
context.Entry(classA).Collection("ClassB_List").Load();
但是,我不知道如何在 ClassB_List 中为 ClassC_List 加载每个子项,而不使用像这样的垃圾:
classA.ClassB_List.ToList().ForEach(c => context.Entry(c).Collection("ClassC_List").Load());
我知道我发现的另一种方法是使用 Include() 在上下文中使用预先加载:
var c = context.ClassA_list
.Include("ClassB_List.ClassC_List")
.ToList();
如果我已经将属性包含在 DBContext 模型中,那么这对于 ClassA 实例列表来说很好,但我不想经常这样做,只想使用显式加载。 有什么想法吗?
【问题讨论】:
【参考方案1】:您已经使用了两种预加载方式:
包括 加载如果你想要一些灵活性,你可以这样做:
var c = context.ClassA_list;
if (IWantTheRelatedTable)
c = c.Include("ClassB_List.ClassC_List");
var result = c.ToList();
您构建一个 IQueryable,然后在它包含您需要的所有包含时执行它。
【讨论】:
由于我喜欢为单个父实体而不是列表加载相关实体,因此是否可以通过显式加载而不使用急切加载来执行此操作?以上是关于在实体内显式加载相关实体的主要内容,如果未能解决你的问题,请参考以下文章