2017-01-13 11 views
7

Biorąc pod uwagę następujące klasy strukturaef-core nieruchomość kolekcja obciążenie zagnieżdżonych TPH dziedziczone członka

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; } 
    } 

Co jest najlepszym sposobem na kwerendy danych nadrzędne zawierać informacje o rachunkach zagranicznych dziecięcych ?. Wymyśliłem rozwiązanie poniżej, stosując wyraźne ładowanie ef-core, ale to po prostu nie brzmi dobrze. Czy istnieje bardziej eleganckie rozwiązanie?

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

Proszę zmienić nazwę 'childs' na' children'. –

+0

Co to jest "AccountInfo"? –

+0

Aby uniknąć obciążania kodu związanego z ładowaniem powiązanych obiektów, należy zezwolić EF na wykonanie tego zadania przez włączenie włączania i ładowania EF. Zajrzyj tutaj, aby uzyskać więcej informacji: https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx – Felix

Odpowiedz

5

Obecnie nie ma sposobu, aby osiągnąć cel, który w zapytaniu macierzystego, ale wyraźny ładowania można poprawić za pomocą kombinacji Entry, Collection, Query, Include/ThenInclude i Load wzywa:

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

Jak mogę rozwinąć to do następnej wartości? Aby nadać kontekstowi, mam następującą strukturę (praca nad konstruktorem formularzy): Form.Questions.Control Z kontrolą będącą podstawą dla klas, takich jak rozwijana lub TextField. –

+0

@ Peter-Paul Więc chcesz dołączyć części kontroli? Nie mogę powiedzieć dokładnie - ponieważ powyższe jest jakimś hackerem, a więc nie ma generalnie rozszerzalnego, możesz rozważyć umieszczenie własnego pytania z próbką [mcve]. –

+0

W końcu zrobiłem to, najpierw pobierając formularz, a następnie przeglądając pytania, aby dodać kontrolę właściwości specyficznych dla klasy. Wiele wywołań bazy danych, ale wykonano zadanie. –