2017-01-13 44 views
7

Aşağıdaki sınıf yapısı verildiğindeiç içe tph devralınan üyenin ef-core yük toplama özelliği

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

Ebeveyn verilerini çocuklara ait offshore hesapları hakkında bilgi içerecek şekilde sorgulamanın en iyi yolu nedir? Ef-core'ın açık yüklemesini kullanarak aşağıdaki çözümden geldim, ancak doğru hissetmiyor. Daha şık bir çözüm var mı?

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

Lütfen lütfen childs'ı 'children' olarak yeniden adlandırın. –

+0

'AccountInfo' nedir? –

+0

İlgili varlıkların yüklenmesi için kod ek yükünden kaçınmak için EF'in bu işi EF tembel yükleme veya istekli yüklemeyi etkinleştirerek yapmasına izin vermelisiniz. Daha fazla bilgi için buraya bakın: https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx – Felix

cevap

5

anda ana sorguda başarmak için bir yolu yoktur, ancak açık bir yükleme Entry bir arada, Collection, Query/ThenIncludeInclude ve Load aramalar kullanılarak geliştirilebilir:

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

Bunu daha aşağıya nasıl genişletebilirim? Bağlam vermek için aşağıdaki yapıya sahibim (bir form oluşturucu üzerinde çalışıyor): Form.Questions.Control Denetim, açılır veya TextField gibi sınıflar için taban türü olmakla birlikte. –

+0

@ Peter-Paul Kontrol bölümlerini eklemek ister misiniz? Tam olarak bir şey söyleyemem - çünkü yukarıdakiler bir tür kesmek olduğundan, genel olarak genişletilemez, kendi somut sorunuzu örneklemle birlikte kaydetmeyi düşünebilirsiniz [mcve]. –

+0

En sonunda, önce formu aldıktan sonra, sınıfa özel özellikler denetimini kontrol ederek eklemek için soruların üzerine çıktım. Veritabanı çağrılarının bir sürü, ama işi bitti. –