我正在使用EF Core 2.1查询我的数据存储。我有一个特定的查询,该查询具有相当深的子对象嵌套。大多数对象只有几个字段,但是,嵌套底部附近是对用户表的引用。
dbContext.Set<A>()
.Include(x => x.B)
.Include(b => b.C)
.ThenInclude(c => c.D)
.ThenInclude(d => d.E)
.ThenInclude(e => e.F)
.ThenInclude(f => f.G)
.ThenInclude(g => g.User)
.SingleOrDefaultAsync(a => a.id == someId);
这很好用,但是,与大多数嵌套表不同,在大多数嵌套表中我想要所有或足够接近所有字段,而User表中的字段远远超出了我想要的数量。我真的只需要3或4个字段,而不是20个字段。这意味着由于行数的原因,select提取了比我想要的更多的数据,并且导致性能下降。
我知道我可以使用匿名类型来控制选择,但是对于这种嵌套很深的东西,很快就会变得难以阅读和维护。
我要做的基本上是进入ThenInclude(g => g.User)
并仅选择该级别的3或4个字段。 EF Core是否可以通过这种方式实现?
[编辑1]
根据要求,这就是为什么我不喜欢匿名类型方法的原因:
dbContext.Set<A>().Select(a => new A {
Id = a.Id,
Description = a.Description,
MapUrl = a.MapUrl,
ListofB = a.B.Select(b => new B {
Id = b.Id,
Field1 = b.Field1,
// Now nest this for another 6 levels and see how unwieldy it becomes when really it's down in g.User where I want to only get a few columns.
ListOfC = b.C.Select(c => new C {
Id = c.Id,
//and so on and so on.
})
})
});