2017-01-13 5 views
7

निम्नलिखित वर्ग संरचनाEF-कोर नेस्ट TPH के लोड संग्रह संपत्ति सदस्य

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

कृपया 'बच्चों' को 'बच्चों' का नाम दें। –

+0

'AccountInfo' क्या है? –

+0

संबंधित इकाइयों को लोड करने के लिए उस कोड ओवरहेड से बचने के लिए आपको ईएफ आलसी लोडिंग या उत्सुक लोडिंग को सक्षम करके ईएफ को उस नौकरी को करने देना चाहिए। अधिक जानकारी के लिए यहां देखें: 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

मैं इसे आगे एक और नीचे टीएफ में कैसे विस्तारित कर सकता हूं? संदर्भ देने के लिए मेरे पास निम्न संरचना है (एक फॉर्म निर्माता पर काम कर रहा है): Form.Questions.Control ड्रॉपडाउन या टेक्स्टफ़िल्ल्ड जैसे वर्गों के लिए बेसटाइप नियंत्रण के साथ। –

+0

@ पीटर-पॉल तो आप नियंत्रण के कुछ हिस्सों को शामिल करना चाहते हैं? मैं बिल्कुल नहीं कह सकता - चूंकि उपरोक्त किसी प्रकार का हैक है, इसलिए कोई सामान्य रूप से विस्तार योग्य नहीं है, तो आप नमूना [mcve] के साथ अपना स्वयं का ठोस प्रश्न पोस्ट करने पर विचार कर सकते हैं। –

+0

मैंने आखिरकार फॉर्म प्राप्त करके इसे किया, फिर नियंत्रण के आधार पर वर्ग विशिष्ट गुणों को नियंत्रित करने के लिए प्रश्नों पर लूपिंग किया। डेटाबेस कॉल के बहुत सारे, लेकिन यह काम पूरा हो गया। –

संबंधित मुद्दे