C# 使用EF Core包含所有继承类中的所有属性
在使用EF6时,我使用的是延迟加载,所以我从来没有遇到过这个问题,但对于EFCore,我不知道单次查询是否可以做到这一点 我的班级结构如下C# 使用EF Core包含所有继承类中的所有属性,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,在使用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 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; }
编辑:
目前,我是这样列出的:
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();
var a=await\u db.As.Include(x=>x.b)
.然后包括(x=>x.list\u c)
.FirstOrDefaultAsync(x=>x.Id=model.Id);
var result=await _db.Ds.of type()
.包括(x=>x.e)
其中(x=>a.b.list\u c.Any(y=>y.Id==x.c\u Id))
.选择(x=>(D)x)
.Concat(_db.Ds.of type()
.包括(x=>x.f)
其中(x=>a.b.list\u c.Any(y=>y.Id==x.c\u Id))
.选择(x=>(D)x))。
.ToListAsync();
如果您有选择,我建议您不要使用实体框架核心。查看路线图-它目前没有惰性加载来指出它(非常恼人)的缺点
您可以将您的数据访问层放在.NET 4.6项目中,并让您的消费项目(即使消费基于Core)毫无困难地引用该项目。如果您有选择,我建议不要使用Entity Framework Core。查看路线图-它目前没有惰性加载来指出它(非常恼人)的缺点
您可以将数据访问层放在.NET 4.6项目中,并让您的消费项目(即使消费基于Core)毫无困难地引用该项目。我希望能够使用完整的框架,但该项目假定仅为.NET Core。这几乎是我正在写的最复杂的查询,因此我可以继续使用当前的解决方案,直到他们添加延迟加载。出于好奇,为什么决定只使用核心?我很想解释一下,但不是我的决定:)收到!在这种情况下,我建议关注路线图。遗憾的是,他们甚至没有承诺在今年实现延迟加载,但他们会尽最大努力:(我正在遵循路线图(主要是因为延迟加载),但实际上这是我应该等待的功能:)我希望能够使用完整的框架,但该项目应该是.NET核心。这几乎是我正在写的最复杂的查询,因此我可以继续使用当前的解决方案,直到他们添加延迟加载。出于好奇,为什么决定只使用核心?我很想解释一下,但不是我的决定:)收到!在这种情况下,我建议关注路线图。可悲的是,他们甚至没有承诺使今年的懒惰加载发生,但他们会尽最大努力:(我遵循路线图(主要是因为懒惰加载),但实际上是我应该等待的特点:)不是我的第一选择,但作为一种选择,你可以考虑使用RAW SQL,用于困难查询的视图或存储过程。这将允许您在2.1中编写包含/包含派生类型的文件,但作为替代方案,您可以考虑使用原始SQL、视图或存储过程来进行疑难查询。这将允许您在2.1版本中对派生类型编写Include/thenclude
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();