EF LINQ में कई और नेस्टेड एंटिटीज शामिल हैं


155

ठीक है, मेरे पास निम्नलिखित पदानुक्रम के साथ त्रि-स्तरीय निकाय हैं: पाठ्यक्रम -> मॉड्यूल -> अध्याय

यहाँ मूल EF LINQ कथन था:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Single(x => x.Id == id); 

अब, मैं लैब नामक एक अन्य संस्था को शामिल करना चाहता हूं जो एक कोर्स से जुड़ी है।

मैं लैब इकाई कैसे शामिल करूं?

मैंने निम्नलिखित कोशिश की लेकिन यह काम नहीं किया:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
                .Single(x => x.Id == id); 

दूसरी इकाई सहित कोई विचार?

सलाह या जानकारी के किसी भी टुकड़े की बहुत सराहना की जाएगी। धन्यवाद!


1
दूसरे .Includeको जोड़ने का काम करना चाहिए जब तक कि आपका मतलब यह न हो कि अतिरिक्त शामिल कोर्स का एक पोता है। इसे देखें या एक बेहतर विकल्प यह है
von v।

संबंधित / के संभावित डुप्लिकेट stackoverflow.com/q/3356541
StuartLC

जवाबों:


234

क्या आपने सिर्फ एक और जोड़ने की कोशिश की है Include:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Include(i => i.Lab)
                .Single(x => x.Id == id);

आपका समाधान विफल हो जाता है क्योंकि Includeबूलियन ऑपरेटर नहीं लेता है

Include(i => i.Modules.Select(s => s.Chapters) &&          i.Lab)
                           ^^^                  ^             ^ 
                          list           bool operator    other list

अपडेट अधिक जानने के लिए, LinqPad डाउनलोड करें और नमूनों के माध्यम से देखें। मुझे लगता है कि यह लिनाक और लैंबडा से परिचित होने का सबसे तेज तरीका है।

एक शुरुआत के रूप में - अंतर के बीच Selectऔर Includeहै कि एक चयन युक्त आप तय करते हैं वह यह है कि क्या आप (प्रक्षेपण उर्फ) वापस जाने के लिए चाहते हैं। शामिल करें एक ईगर लोडिंग फ़ंक्शन है, जो एंटिटी फ्रेमवर्क को बताता है कि आप इसे अन्य तालिकाओं से डेटा शामिल करना चाहते हैं।

शामिल सिंटैक्स स्ट्रिंग में भी हो सकता है। ऐशे ही:

           db.Courses
            .Include("Module.Chapter")
            .Include("Lab")
            .Single(x => x.Id == id);

लेकिन LinqPad में नमूने इस बेहतर बताते हैं।


इसकी प्रशंसा करना! मैं इससे अधिक कहां सीख सकता हूं? मुझे विशेष रूप से शामिल करने और चयन करने के बीच के अंतर में दिलचस्पी है
AnimaSola

3
केवल इस एक ने मेरे लिए काम किया .Include("Module.Chapter"):। किसी भी विचार क्यों होगा?
जो स्मू

5
@JoSmo आपको System.Data.Enityएक्सटेंशनमिथोड तक पहुंचने के लिए नाम स्थान को आयात करने की आवश्यकता है । यहाँ
जेन्स क्लोस्टर

using System.Data.Entity;इसे करें। धन्यवाद!
जो स्मो

1
शानदार linqpad का उल्लेख करने के लिए upvoted, और System.Data.ntity, thx जेन्स का उपयोग करने के लिए टिप
माइक

38

एंटिटी फ्रेमवर्क कोर ( EF.core) में आप .ThenIncludeअगले स्तरों को शामिल करने के लिए उपयोग कर सकते हैं ।

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

अधिक जानकारी: https://docs.microsoft.com/en-us/ef/core/querying/related-data

नोट: मान लें कि आपको एक से अधिक की आवश्यकता ThenInclude()है blog.Posts, बस दोहराएं Include(blog => blog.Posts)और दूसरा करें ThenInclude(post => post.Other)

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Other)
 .ToList();

EF.core में मैं ऐसा करने में सक्षम नहीं प्रतीत होता हूं। Include (i => i.Modules.Select (s => s.Chapters)), विशेष रूप से। अंदर का चयन करें। Include क्या कोई इसकी पुष्टि या बोल सकता है?
ttugates

@ttugates आप इस चयन के साथ क्या करने का इरादा रखते हैं? मुझे लगता है कि आप जो करना चाहते हैं वही आप ThenIncludeईएफ कोर में करते हैं। शायद एक अच्छे उदाहरण के साथ एक सवाल करें, ताकि हम इसका जवाब दे सकें।
निक एन

@ एनक एन - एंटिटी फ्रेमवर्क लाइनक क्वेरी: मल्टीपल न्यू प्रॉपर्टीज पर कहां से और कैसे 3 डी प्रॉपर्टी सेलेक्ट करें । क्योंकि मैं जो चुन रहा हूं, वह मैं पर मेल नहीं खा रहा हूं, इसमें शामिल करना आवश्यक नहीं है इसलिए प्रश्न स्पर्शनीय है। मेरा सवाल बहुत "संकीर्ण" हो सकता है लेकिन किसी भी मदद की सराहना करें।
ttugates

1
आह। दरअसल, .ThenInclude () काम करता है। संबंधित तालिकाओं को प्रदर्शित करने के लिए बस हमेशा के लिए ले जाता है।
क्रिस जे

23

Includeधाराप्रवाह इंटरफ़ेस का एक हिस्सा है, तो आप Includeएक दूसरे के बाद कई बयान लिख सकते हैं

 db.Courses.Include(i => i.Modules.Select(s => s.Chapters))
           .Include(i => i.Lab)
           .Single(x => x.Id == id); 

इसकी प्रशंसा करना! क्या आप मुझे इस ओर इशारा कर सकते हैं कि मैं इससे और अधिक कहां सीख सकता हूं? धन्यवाद!
अणिमासोला

1
क्या आपको पता है कि अगर मॉड्यूल में कई टेबल हैं, जिसमें आप शामिल होना चाहते हैं, तो सिंटैक्स क्या है? इसे अध्याय और कुछ और से जोड़ते हैं?
डेविड स्पेन्स

क्या .Net का धाराप्रवाह हिस्सा है या यह एक पुस्तकालय है जिसे स्थापित करने की आवश्यकता है?
कोडिया

19

आप भी आजमा सकते हैं

db.Courses.Include("Modules.Chapters").Single(c => c.Id == id);

4
धन्यवाद - बहुत उपयोगी स्ट्रिंग में डॉट नोटेशन
एवर्ट

1
यह उपयोगी हो सकता है, लेकिन, इसका उपयोग नहीं करने का एक कारण बाद में रीफैक्टरिंग में आसानी है: यदि आप किसी बिंदु पर "अध्याय" इकाई का नाम बदलते हैं, तो दूसरा उदाहरण स्वचालित रूप से नाम दिया जाएगा। एक और यह है कि त्रुटियां जल्द ही मिल जाएंगी: संकलन समय पर, रन समय नहीं।
एमजीओवेन

2

एक इस तरह से एक विस्तार विधि लिख सकता है:

    /// <summary>
    /// Includes an array of navigation properties for the specified query 
    /// </summary>
    /// <typeparam name="T">The type of the entity</typeparam>
    /// <param name="query">The query to include navigation properties for that</param>
    /// <param name="navProperties">The array of navigation properties to include</param>
    /// <returns></returns>
    public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties)
        where T : class
    {
        foreach (var navProperty in navProperties)
            query = query.Include(navProperty);

        return query;
    }

और एक सामान्य कार्यान्वयन में भी इसका उपयोग करें:

string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" };

var query = context.Set<T>()
.Include(includedNavigationProperties);

मैं आपके उत्तर की कोशिश कर रहा था, लेकिन यह स्वयं के साथ एक अनंत लूप के कारण स्टैकओवरफ़्लोएक्सएक्सडैप्शन फेंक रहा है।
विक्टोरिया एस।

1
@VictoriaS।, आप एक्सटेंशन विधि का नाम बदल सकते हैं ताकि यह वास्तविक के साथ हस्तक्षेप न करेInclude
मोहसिन अफशिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.