【发布时间】:2017-08-29 18:04:06
【问题描述】:
在使用 EF6 时,我使用的是延迟加载,所以我从来没有遇到过这个问题,但是使用 EFCore,我不知道这是否可以通过单个查询来实现。
我有以下类结构
class A { public B b; }
class B { public ICollection<C> list_c; }
class C { public ICollection<D> list_d; }
abstract class D { public long c_id; }
class Da { public E e; }
class Db { public F f; }
我需要所有D 对象的列表,但可以分别访问它们的e 和f 属性。我现在有一个工作查询,我在c_id 列表上查询_db.D,我使用下面查询的前半部分获取,但是通过这种方法,我发送一个查询来获取所有@987654329 @'s 然后每种类型一个查询(我有 4 种类型)。
我想知道我是否可以通过一个看起来像这样的调用来使其工作:
_db.As.Include(x => x.b)
.ThenInclude(x => x.list_c)
.ThenInclude(x => x.list_d)
// some magic here
.FirstOrDefaultAsync(x=> x.Id = model.Id);
编辑:
目前我是这样列出清单的:
var a = await _db.As.Include(x => x.b)
.ThenInclude(x => x.list_c)
.FirstOrDefaultAsync(x=> x.Id = model.Id);
var result = await _db.Ds.OfType<Da>()
.Include(x=>x.e)
.Where(x=>a.b.list_c.Any(y=>y.Id == x.c_id))
.Select(x=>(D)x)
.Concat(_db.Ds.OfType<Db>()
.Include(x=>x.f)
.Where(x=>a.b.list_c.Any(y=>y.Id == x.c_id))
.Select(x=>(D)x)).
.ToListAsync();
【问题讨论】:
-
不是我的首选,但作为替代方案,您可以考虑使用原始 sql、视图或存储过程来处理困难的查询。 stackoverflow.com/questions/35305825/…
-
github.com/aspnet/EntityFrameworkCore/issues/3910 这将允许您在 2.1 版本中对派生类型编写 Include/ThenInclude
标签: c# entity-framework entity-framework-core