2012-05-30 13 views
221

शामिल करें() विधि ऑब्जेक्ट्स पर सूचियों के लिए काफी अच्छी तरह से काम करती है। लेकिन अगर मुझे दो स्तरों को गहराई से जाना है तो क्या होगा? उदाहरण के लिए, नीचे दी गई विधि एप्लिकेशनसेवर को यहां दिखाए गए शामिल गुणों के साथ वापस कर देगी। हालांकि, एप्लीकेशनविथऑवरराइड समूह एक और कंटेनर है जो अन्य जटिल वस्तुओं को रखता है। क्या मैं उस संपत्ति पर एक शामिल() भी कर सकता हूं? या मैं उस संपत्ति को पूरी तरह लोड करने के लिए कैसे प्राप्त कर सकता हूं?इकाई फ्रेमवर्क - गुणों के एकाधिक स्तर शामिल करें

यह अब खड़ा के रूप में, इस विधि:

public IEnumerable<ApplicationServer> GetAll() 
{ 
    return this.Database.ApplicationServers 
     .Include(x => x.ApplicationsWithOverrideGroup)     
     .Include(x => x.ApplicationWithGroupToForceInstallList) 
     .Include(x => x.CustomVariableGroups)     
     .ToList(); 
} 

केवल सक्षम संपत्ति (नीचे) बस जाएँगे और न आवेदन या CustomVariableGroup गुण (नीचे)। मैं यह कैसे करूं?

public class ApplicationWithOverrideVariableGroup : EntityBase 
{ 
    public bool Enabled { get; set; } 
    public Application Application { get; set; } 
    public CustomVariableGroup CustomVariableGroup { get; set; } 
} 
+0

नमस्ते, मुझे अपवाद क्यों मिलता है 'अभिव्यक्ति एक सदस्य अभिव्यक्ति होना चाहिए' जब मैं इसे आज़माता हूं: संग्रह को शामिल करने के लिए और फिर संग्रह को एक स्तर नीचे: 'query.Include (e => e.Level1Collection.Select (l1 => l1.Level2Collection)) '। –

+1

@ बॉबहोर्न, मेरे पास एक ही समस्या है .. मेरे मामले में, घोंसले कई परतों को गहरा कर देता है, मैं आपको शामिल करने में कामयाब रहा हूं। जेनरेट होने वाले एसक्यूएल में, मैं देख सकता था कि सभी कॉलम अलग-अलग उपनाम नामों के साथ सी 1, सी 2 जैसे कुछ लौट रहे हैं। मेरा सवाल यह है कि, मैं अपने सभी में से एक नेस्टेड डीटीओ संग्रह कैसे बना सकता हूं :(.. हो सकता है कि आप ऊपर दिए गए उदाहरण को स्वयं ले सकें, जिसमें हम बिना किसी कस्टम डीटीओ के सभी कॉलम लौट रहे हैं (जो स्वयं डीटीओ का संग्रह है) – TechQuery

उत्तर

418

एफई 6

लिए
using System.Data.Entity; 

query.Include(x => x.Collection.Select(y => y.Property)) 

अधिक उदाहरण के लिए Remarks देखें।

Include का संस्करण प्राप्त करने के लिए using System.Data.Entity; जोड़ने के लिए सुनिश्चित करें कि एक लैम्ब्डा में लेता है।


आप एफई कोर का उपयोग कर रहे हैं, तो आप "ThenInclude" एकाधिक स्तरों लोड करने के लिए उपयोग करना नई विधि ThenInclude

query.Include(x => x.Collection) 
    .ThenInclude(x => x.Property); 
+1

मैं एप्लीकेशन (थऑवरराइड समूह) में शामिल() शामिल नहीं कर सकता। यह इंटेलिजेंस में दिखाई नहीं देता है। –

+0

मैं आपके संपादन का उपयोग नहीं कर सकता क्योंकि अनुप्रयोग WithOverrideGroup एक सूची है। आवेदन सूची में प्रत्येक आइटम पर एक संपत्ति है, सूची में नहीं। –

+1

अहह्ह, लेकिन आपके द्वारा प्रदान किया गया लिंक उत्तर प्रदान करता है। मुझे इसे आज़माएं: संग्रह को शामिल करने के लिए और फिर संग्रह को एक स्तर नीचे: क्वेरी। शामिल करें (e => e.Level1Collection.Select (l1 => l1.Level2Collection))। –

43

यदि मैं आपको सही ढंग से समझता हूं तो आप नेस्टेड गुणों को शामिल करने के बारे में पूछ रहे हैं। यदि ऐसा है तो:

.Include(x => x.ApplicationsWithOverrideGroup.NestedProp) 

या

.Include("ApplicationsWithOverrideGroup.NestedProp") 

या

.Include($"{nameof(ApplicationsWithOverrideGroup)}.{nameof(NestedProp)}") 
+4

धन्यवाद, मैं कोशिश कर सकता हूं। मैं उम्मीद कर रहा था कि चीजों को दृढ़ता से टाइप किया जाए और स्ट्रिंग अक्षर से बचें। लेकिन अगर ऐसा किया जाना है ... –

+0

आप करीब थे। मुझे यह स्पष्ट नहीं हो सकता था कि एप्लीकेशनविथऑवर्राइड समूह एक सूची थी। मदद के लिए धन्यवाद! –

+0

@ जुडो, मेरे पास एक ही समस्या है .. मेरे मामले में, घोंसले कई परतों को गहरा कर देता है, मैं आपको शामिल करने में कामयाब रहा हूं। एसक्यूएल में जो उत्पन्न हुआ, मैं कर सकता था देखें कि सभी कॉलम अलग-अलग उपनाम नामों के साथ सी 1, सी 2 के रूप में कुछ लौट रहे हैं। मेरा सवाल यह है कि, मैं अपने सभी में से एक नेस्टेड डीटीओ संग्रह कैसे बना सकता हूं :(.. हो सकता है कि आप ऊपर दिए गए उदाहरण को स्वयं ले सकें हम सभी कॉलम डब्ल्यू वापस कर रहे हैं किसी भी कस्टम डीटीओ (जो स्वयं डीटीओ का संग्रह है) के बिना – TechQuery

24

उपयोग कर सकते हैं: उदाहरण के लिए:

var blogs = context.Blogs 
    .Include(blog => blog.Posts) 
     .ThenInclude(post => post.Author) 
     .ThenInclude(author => author.Photo) 
    .ToList(); 
+36

ऐसा लगता है कि यह ईएफ कोर केवल –

+6

एफवाईआई: वीएस2017 इंटेलिजेंस काम नहीं कर रहा था। फिर शामिल करें। बस इसे टाइप करें कि आपको कैसा लगता है कि यह होना चाहिए और त्रुटि हाइलाइटिंग दूर होनी चाहिए। – JohnWrensby

+0

मैं @ जॉन वॉरेनस्बी की टिप्पणी पर जोर देना चाहता हूं, इंटेलिजेंस कभी-कभी इन्हें संभालने में विशेष रूप से लंबा समय ले सकता है, फिर भी यह नए उपयोगकर्ताओं के लिए काफी भ्रमित हो सकता है। मेरे पास ऐसे मामले भी थे जहां सरल शामिल लैम्ब्डा अभिव्यक्ति को ठीक से संभाला नहीं गया था, जब तक कि आप इसे टाइप न करें और इसे संकलित न करें, वीएस में दिखाए गए "त्रुटियों" को अनदेखा कर दें। – Pac0

13

मैं एक बना एंटिटी फ्रेमवर्क 6 (नेट कोर स्टाइल) के लिए थोड़ा सहायक, उप-इकाइयों को एक अच्छे तरीके से शामिल करने के लिए।

यह NuGet पर है: स्थापित करें-पैकेज ThenInclude.EF6

using System.Data.Entity; 

var thenInclude = context.One.Include(x => x.Twoes) 
    .ThenInclude(x=> x.Threes) 
    .ThenInclude(x=> x.Fours) 
    .ThenInclude(x=> x.Fives) 
    .ThenInclude(x => x.Sixes) 
    .Include(x=> x.Other) 
    .ToList(); 
8

मैं भी कई का इस्तेमाल किया था शामिल और 3 स्तर पर मैं कई गुण

(from e in context.JobCategorySet 
         where e.Id == id && 
          e.AgencyId == agencyId 
         select e) 
         .Include(x => x.JobCategorySkillDetails) 
         .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.DurationType)) 
         .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RuleType)) 
         .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RateType)) 
         .FirstOrDefaultAsync(); 

यह किसी की मदद कर सकते हैं की जरूरत:)

+0

यह दोहराने के बिना किया जा सकता है। शामिल करें (x => x.Shifts.Select (r => r.Rate)। चयन करें (आरटी => आरटी ...... ' – Multinerd

+0

अच्छी तरह से यह निर्भर करता है, आप कितना गहराई से चाहते हैं – dnxit

3

अधिक EFCore examples on MSDN दिखाता है कि आप Include और ThenInclude के साथ कुछ जटिल चीजें कर सकते हैं।

यह एक अच्छा उदाहरण है कि आप कितना जटिल हो सकते हैं (यह सब एक बयान है!):

viewModel.Instructors = await _context.Instructors 

     .Include(i => i.OfficeAssignment) 

     .Include(i => i.CourseAssignments) 
     .ThenInclude(i => i.Course) 
      .ThenInclude(i => i.Enrollments) 
       .ThenInclude(i => i.Student) 

     .Include(i => i.CourseAssignments) 
     .ThenInclude(i => i.Course) 
      .ThenInclude(i => i.Department) 

     .AsNoTracking() 
     .OrderBy(i => i.LastName) 
     .ToListAsync(); 

देखें कि आप कर सकते हैं श्रृंखला IncludeThenInclude के बाद भी और यह एक तरह से तुम वापस शीर्ष स्तर इकाई (प्रशिक्षक) के स्तर पर 'रीसेट करता है'।

आप अलग-अलग बच्चे इकाइयों को प्राप्त करने के लिए अलग-अलग ThenIncludes आदेशों के बाद कई बार 'प्रथम स्तर' संग्रह (कोर्स एसिग्मेंटमेंट) को दोहरा सकते हैं।

नोट करें कि आपकी वास्तविक क्वेरी Include या ThenIncludes श्रृंखला के अंत में टैग की जानी चाहिए। निम्नलिखित काम नहीं करता:

दृढ़ता से आप प्रवेश की स्थापना की और सुनिश्चित करें कि आपके प्रश्नों आप एक से अधिक या दो चीजों को शामिल कर रहे हैं, तो नियंत्रण से बाहर नहीं कर रहे हैं अनुशंसा करेंगे। यह देखना महत्वपूर्ण है कि यह वास्तव में कैसे काम करता है - और आप देखेंगे कि अलग-अलग 'शामिल' आमतौर पर अनावश्यक डेटा लौटने में बड़े पैमाने पर जुड़ने से बचने के लिए एक नई क्वेरी है।

AsNoTracking चीजों को बहुत तेज़ी से बढ़ा सकता है यदि आप वास्तव में इकाइयों को संपादित करने और सहेजने का इरादा नहीं रखते हैं।

+0

क्या आपके नामांकन के बिना नामांकन और विभाग दोनों प्राप्त करने का कोई तरीका है। कोर्स एस्सिग्मेंटमेंट और कोर्स के लिए शामिल है? (अब तक ऐसा लगता है कि एपीआई गहरे साथ जा सकता है। फिर शामिल करें, या शीर्ष स्तर पर वापस जाएं। शामिल करें, लेकिन एक ही स्तर पर रहने के लिए कुछ भी नहीं है?) –

+0

यदि आप आलसी लोडिंग के लिए आलसी लोडिंग रहना चाहते हैं 2.1 https://blogs.msdn.microsoft.com/dotnet/2018/02/02/entity-framework-core -2-1-रोडमैप/लेकिन यदि आप सिर्फ एक ही स्तर पर अधिक लोड करना चाहते हैं तो मुझे लगता है कि यह डिज़ाइन द्वारा है। मुझे यकीन नहीं है कि आप क्या सोच रहे हैं - इसे करने के लिए बहुत अधिक आवश्यकता नहीं है और यह बहुत अधिक है डेटाबेस से वापस आता है जो कम करता है। एक इकाई में केवल एक या दो 'समान-स्तर' चीजें हो सकती हैं लेकिन इसमें एक बड़ी परियोजना के लिए 50 भी हो सकते हैं, हो सकता है स्पष्ट रूप से आपके ऐप को बहुत तेज बनाता है। –

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