在 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));
}
我有一个程序使用 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));
}