Я использую 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, что у него есть.Это означает, что из-за количества строк выборка получает больше данных, чем мне нужно, и вызывает некоторое снижение производительности.
Я знаю, что могу использовать анонимные типы для управления выборкой, но длячто-то такое глубоко вложенное, что быстро становится огромной головной болью для чтения и обслуживания.
Что я хочу сделать, так это просто войти в ThenInclude(g => g.User)
и выбрать только 3 или 4 поля на этом уровне.Возможно ли это как-то с EF Core?
[Edit 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.
})
})
});