EF Core фильтрует поля глубоко вложенных дочерних объектов - PullRequest
0 голосов
/ 07 декабря 2018

Я использую 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.
        })
     })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...