我可以同时使用急切和延迟加载吗?

Posted

技术标签:

【中文标题】我可以同时使用急切和延迟加载吗?【英文标题】:Can I use eager and lazy loading at the same time? 【发布时间】:2019-11-15 20:43:44 【问题描述】:

我有一个开启延迟加载的模型类。到目前为止,我一直使用延迟加载,例如为单个学生加载他的课程集合。

如果我想加载所有已注册学生集合的所有课程,我可以使用 Include() 方法在延迟加载的属性上预先加载吗?有没有副作用?

[ForeignKey("Id")]
public virtual ICollection<Students> Students  get; set; 
public IQueryable<Students> GetCoursesWithAllStudents()

     return db.Courses.Include(c => c.Students);

【问题讨论】:

没有问题,没有副作用。 【参考方案1】:

是的,你可以。 Include() 专门这样做,它包括 相关实体:它强制它们在正常情况下不被加载。您可以添加ThenInclude() 以更深入地了解关系阶梯,因为它允许加载与先前包含的实体相关的数据。 但是,返回的实体是阶梯中最高的实体,而不是最新的。 在下面的示例中,返回一个 IQueryable&lt;Professors&gt;,加载了 Courses 实体,并在 Courses 内部,Students

public IQueryable<Professors> GetCoursesWithAllStudents()

     return db.Professors.Include(professor => professor.Courses)
                         .ThenInclude(course => course.Students);

【讨论】:

以上是关于我可以同时使用急切和延迟加载吗?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ中的First()会导致急切或延迟加载吗?

何时在休眠中使用延迟加载/急切加载?

实体框架急切加载不返回数据,延迟加载有

远程案例中的延迟/急切加载策略(JPA)

延迟加载孩子,里面有急切的集合

Xamarin Forms Shell - 一次加载每个选项卡 - 急切加载而不是延迟加载