2017-01-13 1 views
7

Учитывая следующей структуру классаэф-ядро коллекция нагрузки свойства вложенного ТРНА унаследовало член

public class Parent 
    { 
     public Guid Id { get; 
     public List<BaseChild> Children { get; set; } 
    } 

public abstract class BaseChild 
    { 
     public int Id { get; set; } 
     public string ChildName { get; set; } 
    } 

public class NormalChild : BaseChild 
    { 
     public DateTime BirthDate { get; set; } 
    } 

public class RichChild : BaseChild 
    { 
     public List<OffshoreAccount> OffshoreAccounts { get; set; } 
    } 

public class OffshoreAccount 
    { 
     public string AccountNumber { get; set; } 
     public AccountInfo AccountInfo { get; set; } 
    } 

Что является лучшим способом запроса родительских данных включают информацию об оффшорных счетах детских ?. Я придумал решение ниже, используя явную загрузку ef-core, но это просто не так. Есть ли более элегантное решение?

var parent = Context.Set<Parent>() 
    .Where(o => o.Id == Guid.Parse(parentId)) 
    .Include(o => o.Children) 
    .SingleOrDefault(); 

foreach (var child in parent.Children.OfType<RichChild>()) 
    { 
     Context.Entry<RichChild>(child).Collection(f => f.OffshoreAccounts).Load(); 
     foreach (var account in child.OffshoreAccounts) 
      { 
       Context.Entry<OffshoreAccount>(account).Reference(f => f.AccountInfo).Load(); 
      } 
    } 
+1

Пожалуйста, переименуйте 'childs' на' children'. –

+0

Что такое 'AccountInfo'? –

+0

Чтобы избежать накладных расходов на код для загрузки связанных объектов, вы должны позволить EF выполнять это задание путем включения EF в ленивую загрузку или загрузку. Дополнительную информацию смотрите здесь: https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx – Felix

ответ

5

В настоящее время нет никакого способа, чтобы добиться этого в родительском запросе, но явная загрузка может быть улучшена за счет использования комбинации Entry, Collection, Query, Include/ThenInclude и Load звонки:

var parent = Context.Set<Parent>() 
    .Where(o => o.Id == Guid.Parse(parentId)) 
    .Include(o => o.Children) 
    .SingleOrDefault(); 

Context.Entry(parent).Collection(e => e.Children) 
    .Query().OfType<RichChild>() 
    .Include(e => e.OffshoreAccounts) 
     .ThenInclude(e => e.AccountInfo) 
    .Load(); 
+0

Как я могу расширить это до дальнейшего downphph? Чтобы предоставить контекст, у меня есть следующая структура (работающая на построителе форм): Form.Questions.Control С элементом управления является базовый тип для таких классов, как раскрывающийся список или TextField. –

+0

@ Peter-Paul Итак, вы хотите включить части управления? Я не могу сказать точно - так как выше это какой-то хак, поэтому нет универсального расширения, вы могли бы рассмотреть возможность опубликовать свой собственный конкретный вопрос с помощью образца [mcve]. –

+0

Я в конце концов сделал это, сначала получив форму, затем перейдя по этим вопросам, чтобы добавить элемент управления свойствами класса с помощью элемента управления. Множество запросов к базе данных, но он выполнил свою работу. –

Смежные вопросы