EF লিনকিউতে একাধিক এবং নেস্টেড সত্তা অন্তর্ভুক্ত রয়েছে


155

ঠিক আছে, আমার নিম্নোক্ত শ্রেণিবদ্ধের সাথে ত্রি-স্তরযুক্ত সত্তা রয়েছে: কোর্স -> মডিউল -> অধ্যায়

এখানে মূল ইএফ লিনকিউ বিবৃতি ছিল:

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করা কাজ করা উচিত যদি না আপনি অতিরিক্ত অর্থ সহ কোর্সের একটি নাতনি ild এটি দেখুন বা আরও ভাল বিকল্পটি হ'ল
ভন বনাম

সংশ্লিষ্ট / সম্ভাব্য সদৃশ 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

আপডেট আরও জানার জন্য , লিনকপ্যাড ডাউনলোড করুন এবং নমুনাগুলি দেখুন। আমি লিনক এবং ল্যাম্বদার সাথে পরিচিত হওয়ার দ্রুততম উপায় বলে আমি মনে করি।

একটি সূচনা হিসাবে - এর মধ্যে পার্থক্য Selectএবং Includeএটি হ'ল একটি নির্বাচনের মাধ্যমে আপনি সিদ্ধান্ত নিতে চান যে আপনি কী ফিরিয়ে দিতে চান (ওরফে অভিক্ষেপ)। অন্তর্ভুক্তি একটি ইজিার লোডিং ফাংশন, এটি সত্তা ফ্রেমওয়ার্ককে বলে যে আপনি এটি অন্যান্য টেবিলের ডেটা অন্তর্ভুক্ত করতে চান।

অন্তর্ভুক্ত বাক্য গঠনটিও স্ট্রিংয়ে থাকতে পারে। এটার মত:

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

তবে লিনকপ্যাডের নমুনাগুলি এটি আরও ভালভাবে ব্যাখ্যা করে।


সন্তুষ্ট! আমি এর থেকে আরও কোথায় শিখতে পারি? আমি অন্তর্ভুক্ত এবং নির্বাচনের মধ্যে পার্থক্য সম্পর্কে বিশেষত আগ্রহী
এনিমাসোলা

3
শুধু এই এক আমার জন্য কাজ: .Include("Module.Chapter")। কোন ধারণা কেন যে হবে?
জো স্মু

5
@ জোসমো আপনাকে System.Data.Enityএক্সটেনশনমিড অ্যাক্সেস করতে নামস্থান আমদানি করতে হবে । আরও তথ্য এখানে
জেনস ক্লোস্টার

using System.Data.Entity;করেছি. ধন্যবাদ!
জো স্মু

1
উজ্জ্বল লিনকপ্যাডের উল্লেখ করার জন্য এবং সিস্টেম.ডাটা.এন্টিটি, থ্যাক্স জেনস ব্যবহারের জন্য টিপস
মাইক

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 এ আমি করতে সক্ষম হব বলে মনে হচ্ছে না I কেউ কি নিশ্চিত বা কথা বলতে পারে?
ttugates

@ ট্যাগগেটস এই নির্বাচনটি নিয়ে আপনি কী করতে চান? আমি মনে করি আপনি যা করতে চান তা হ'ল ThenIncludeইএফ কোরের সাথে আপনি যা করেন। সম্ভবত একটি ভাল উদাহরণ সহ একটি প্রশ্ন করুন, যাতে আমরা এটির উত্তর দিতে পারি।
নিক এন।

@ নিক এন - সত্তা ফ্রেমওয়ার্ক লিনক ক্যোয়ারী: একাধিক ন্যাভ প্রোপার্টি কোথায় পাবেন এবং তৃতীয় ন্যাভ সম্পত্তি থেকে নির্বাচন করুন । কারণ আমি যা নির্বাচন করি তা নয় যা আমি মিলে যাচ্ছি, ইনক্লুডগুলি প্রয়োজনীয় নয় তাই প্রশ্নটি স্পর্শকাতর। আমার প্রশ্নটি খুব "সংকীর্ণ" হতে পারে তবে কোনও সহায়তার প্রশংসা করতে পারে।
ttugates

1
আহ। আসলে, .তখনই () কাজ করে। ইন্টেলিজেন্স সম্পর্কিত টেবিলগুলি প্রদর্শন করতে কেবল চিরকাল লাগে takes
ক্রিস জে

23

Includeসাবলীল ইন্টারফেসের একটি অংশ, সুতরাং আপনি Includeএকে অপরের নীচে একাধিক বিবৃতি লিখতে পারেন

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

সন্তুষ্ট! আপনি কি আমাকে ইঙ্গিত করতে পারেন যেখানে আমি এগুলি আরও শিখতে পারি? ধন্যবাদ!
অ্যানিমাসোলা

1
আপনি যদি জানেন যে মডিউলগুলিতে আপনি যোগদান করতে চান এমন একাধিক টেবিল রয়েছে তবে সিনট্যাক্সটি কী? এটি অধ্যায় এবং অন্য কিছু লিঙ্ক বলতে?
ডেভিড স্পেন্স

। নেট এর অনর্গল অংশ বা এটি একটি লাইব্রেরি ইনস্টল করা প্রয়োজন?
কোডে

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
মোহসেন Afshin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.