在 EF Core 中延迟加载时如何加载多个级别?

How can I load multiple levels when lazy loading in EF Core?

我有一个程序使用 C#/WPF 和 SQL 服务器与 EF Core 5。有时我使用预先加载,例如:

(from r in MyContext.Refractions where r.Id == id select r)
    .Include(r => r.RightLens)
    .ThenInclude(l => l.Prisms);

等等。这是一个光学数据数据库,因此是字段名称。 Refractions 链接到(眼睛)Examinations

当我想延迟加载时,我使用以下:

MyContext.Entry(patient)
         .Collection(e => e.Examinations).Load();

我的问题是,当使用第二个惰性选项时,有没有办法同时加载关联数据(相当于 .Include 用于 Load 方法)?

例如,我想要相当于:

MyContext.Entry(patient)
         .Collection(e => e.Examinations)
         .Load().Include(r => r.Refractions);

或者我是否需要检测 Refractions 集合未加载到我的视图模型中的某处,然后在需要时手动加载它?

因为我认为这还不可能,你可以写一些这样的方法:

public IEagerLoadedQueryable<E, P> LoadRelated<E, P>(IQueryable<E> query, Expression<Func<E, P>> navProperty) where E : class {
  var q= query.Include(navProperty);
  return new EagerLoadedQueryable<E, P>(q);
}

public IEagerLoadedQueryable<E, Prop> ThenLoadRelated<E, Prev, Prop>(IEagerLoadedQueryable<E, IEnumerable<Prev>> query, Expression<Func<Prev, Prop>> navProperty) where E : class {
  var q= (IIncludableQueryable<E, IEnumerable<Prev>>)query;
  return new EagerLoadedQueryable<E, Prop>(q.ThenInclude(navProperty));
}


public IEagerLoadedQueryable<E, Prop> ThenLoadRelated<E, Prev, Prop>(IEagerLoadedQueryable<E, Prev> query, Expression<Func<Prev, Prop>> navProperty) where E : class {
  var q= (IIncludableQueryable<E, Prev>)query;
  return new EagerLoadedQueryable<E, Prop>(q.ThenInclude(navProperty));
}