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

时间:2021-04-22 13:56:31

标签: c# sql-server entity-framework-core relational-database lazy-loading

我有一个使用 C#/WPF 和 SQL Server 和 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 集合未在我的视图模型中的某处加载,然后在需要时手动加载?

1 个答案:

答案 0 :(得分:1)

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

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));
}
相关问题