সত্তা ফ্রেমওয়ার্ক - বৈশিষ্ট্যের একাধিক স্তর অন্তর্ভুক্ত


376

অন্তর্ভুক্ত () পদ্ধতি অবজেক্টগুলির তালিকাগুলির জন্য বেশ ভাল কাজ করে। তবে আমার কী দরকার যদি দুই স্তরের গভীরে যেতে হয়? উদাহরণস্বরূপ, নীচের পদ্ধতিটি এখানে দেখানো অন্তর্ভুক্ত বৈশিষ্ট্য সহ অ্যাপ্লিকেশন সার্ভারগুলি ফিরিয়ে দেবে। তবে অ্যাপ্লিকেশনস উইথওভারাইড গ্রুপটি আরও একটি ধারক যা অন্যান্য জটিল বস্তু ধারণ করে। আমি কি সেই সম্পত্তিটিতে একটি অন্তর্ভুক্ত () করতে পারি? বা কীভাবে আমি সেই সম্পত্তি পুরোপুরি লোড করতে পারি?

এখন যেমন দাঁড়িয়ে আছে, এই পদ্ধতি:

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

অ্যাপ্লিকেশন বা কাস্টম ভেরিয়েবলগ্রুপ বৈশিষ্ট্যগুলি (নীচে) নয় কেবলমাত্র সক্ষম সম্পত্তি (নীচে) তৈরি করবে। আমি এটি কীভাবে করব?

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

হাই, আমি কেন ব্যতিক্রম পেতে Expression must be a member expressionযখন আমি এই চেষ্টা করে দেখুন: একটি সংগ্রহ এবং তারপর একটি সংগ্রহে এক নিচে স্তর অন্তর্ভুক্ত করার জন্য: query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
জো.ওয়াং

1
@ বিজনহর্ন, আমারও একই সমস্যা আছে .. আমার ক্ষেত্রে, বাসা বাঁধে একাধিক স্তর গভীরতর হয়, আমি আপনাকে নির্দেশিত একটি অন্তর্ভুক্ত করতে পেরেছি। যে এসকিউএল জেনারেট হয়েছিল তাতে আমি দেখতে পেলাম যে সমস্ত কলামগুলি আলাদা আলাদা নাম দিয়ে সি 1, সি 2 এর মতো ফিরে আসছে। আমার প্রশ্নটি হল, আমি কীভাবে আমার সমস্ত অন্তর্ভুক্ত থেকে নেস্টেড ডিটিও সংগ্রহ করতে পারি :( .. আপনি নিজেই উপরের উদাহরণটি নিতে পারেন, আমরা কোনও কাস্টম ডিটিও ছাড়াই সমস্ত কলাম ফিরিয়ে দিচ্ছি (যা নিজেই ডিটিওর সংগ্রহ )
টেককিউয়ারি

উত্তর:


703

EF 6 এর জন্য

using System.Data.Entity;

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

যে ল্যাম্বডায় লাগে using System.Data.Entity;তার সংস্করণটি পেতে অবশ্যই তা নিশ্চিত করুন Include


EF কোর জন্য

নতুন পদ্ধতিটি ব্যবহার করুন ThenInclude

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

1
আমি অ্যাপ্লিকেশনস উইথওভারাইড গ্রুপে অন্তর্ভুক্ত () করতে পারি না। এটি ইন্টেলিজেন্সে প্রদর্শিত হয় না।
বব হর্ন

আমি আপনার সম্পাদনাটি ব্যবহার করতে পারি না কারণ অ্যাপ্লিকেশনস উইথওভারাইড গ্রুপটি একটি তালিকা। অ্যাপ্লিকেশন হ'ল তালিকার প্রতিটি আইটেমের সম্পত্তি, তালিকায় নয়।
বব হর্ন

1
আহ্, তবে আপনার দেওয়া লিঙ্কটি উত্তর সরবরাহ করে বলে মনে হচ্ছে। আমাকে এটি চেষ্টা করে দেখতে দিন: একটি সংগ্রহ এবং তারপরে একটি স্তর এক স্তর নীচে অন্তর্ভুক্ত করতে: ক্যোয়ারী Iআপনিভুক্ত করুন (e => ই e লেভেল 1 সংগ্রহ S নির্বাচন করুন (l1 => l1.Level2 Colલેક્શન))।
বব হর্ন

60
ব্যবহারের ক্ষেত্রে সিস্টেম.ডাটা.এন্টি অন্তর্ভুক্ত মনে রাখবেন। অন্যথায় ইন্টেলিজেন্স আপনাকে কেবল পদ্ধতির অন্তর্ভুক্ত (স্ট্রিং পাথ) সংস্করণ দেবে।
ওজে রাকিয়েও

5
@ অ্যাডিম আপনার Includeপ্রতিটি সম্পত্তি জন্য কল করা প্রয়োজন :Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
দিয়েগো টরেস

72

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি নেস্টেড সম্পত্তি যুক্ত করার বিষয়ে জিজ্ঞাসা করছেন। যদি তাই :

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

অথবা

.Include("ApplicationsWithOverrideGroup.NestedProp")  

অথবা

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

6
ধন্যবাদ, আমি এটি চেষ্টা করতে পারি। আমি আশা করছিলাম যে জিনিসগুলি দৃ strongly়ভাবে টাইপ করতে সক্ষম হব এবং স্ট্রিং লিটারালগুলি এড়াতে সক্ষম হব। তবে যদি এটিই করা হয় তবে ...
বব হর্ন

1
আপনি বন্ধ ছিল. আমি স্পষ্টভাবে বলতে পারি না যে অ্যাপ্লিকেশনস উইথওভারাইড গ্রুপটি একটি তালিকা ছিল। সাহায্য করার জন্যে ধন্যবাদ!
বব হর্ন

@ জুডো, আমারও একই সমস্যা আছে my আমার ক্ষেত্রে বাসা বাঁধে একাধিক স্তর গভীরভাবে চলে যায়, আমি আপনার নির্দেশিত একটি অংশটি পরিচালনা করতে সক্ষম হয়েছি। যে এসকিউএল জেনারেট হয়েছিল তাতে আমি দেখতে পেলাম যে সমস্ত কলামগুলি আলাদা আলাদা নাম দিয়ে সি 1, সি 2 এর মতো ফিরে আসছে। আমার প্রশ্নটি হল, আমি কীভাবে আমার সমস্ত অন্তর্ভুক্ত থেকে নেস্টেড ডিটিও সংগ্রহ করতে পারি :( .. আপনি নিজেই উপরের উদাহরণটি নিতে পারেন, আমরা কোনও কাস্টম ডিটিও ছাড়াই সমস্ত কলাম ফিরিয়ে দিচ্ছি (যা নিজেই ডিটিওর সংগ্রহ )
টেককিউয়ারি

2
ব্যবহারের ক্ষেত্রে সিস্টেম.ডাটা.এন্টি অন্তর্ভুক্ত মনে রাখবেন । অন্যথায় ইন্টেলিজেন্স আপনাকে কেবল Include(string path)পদ্ধতির সংস্করণ দেবে ।
অ্যালেক্সমেলউ 29:38

52

ইএফ কোর: একাধিক স্তর লোড করতে "থেইনকিঙ্কেলড" ব্যবহার করে: উদাহরণস্বরূপ:

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

53
দেখে মনে হচ্ছে এটি কেবলমাত্র ইএফ কোর
ক্রিস মেরিসিক

27
এফওয়াইআই: ভিএস2017 ইন্টেলিসেন্স কাজ করছে না .তখন অন্তর্ভুক্ত করুন। আপনার কীভাবে এটি হওয়া উচিত বলে টাইপ করুন এবং হাইলাইট করার ত্রুটিটি দূরে চলে যাওয়া উচিত go
ওয়ার্নসবি

4
আমি @ জনভেনসবি'র মন্তব্যে জোর দিতে চাই, ইনটেলিসেন্স মাঝে মাঝে বিশেষত এই থিটারনক্লাউনড পরিচালনা করতে দীর্ঘ সময় নিতে পারে, এটি নতুন ব্যবহারকারীদের জন্য বেশ বিভ্রান্তিকর হতে পারে। আমারও এমন ঘটনা ছিল যেখানে সরল অন্তর্ভুক্ত ল্যাম্বডা এক্সপ্রেশনটি সঠিকভাবে পরিচালনা করা হয় না, যতক্ষণ না আপনি কেবল এটি টাইপ করেন এবং এটি সংকলন করেন, ভিএস-এ প্রদর্শিত "ত্রুটিগুলি" উপেক্ষা করে ignoring
প্যাক0

@ প্যাক ০ আপনি আমার দিন বাঁচিয়েছেন। সন্তানের আইটেমগুলি দেখতে লড়াই করেও পারছে না।
বেনড্রাম

28

উপ-সত্তাগুলি একটি দুর্দান্ত উপায়ে অন্তর্ভুক্ত করতে আমি সত্ত্বা ফ্রেমওয়ার্ক 6 (। নেট কোর স্টাইল) এর জন্য একটু সহায়ক করেছি।

এটি এখন নুগেটে রয়েছে: ইনস্টল-প্যাকেজ থিইনক্লুড করুন Eএফ 6

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();

প্যাকেজটি গিটহাবে পাওয়া যায়


হাই, রানটাইমের সময় আমার ব্যতিক্রম আছে, IncludableQueryable <observablecolલેક્>> কে IncludableQueryable <জেনেরিককোলেশন>
ব্যবহারকারীর 2475096

আমি প্রথমে ডিবি ব্যবহার করছি এবং আমার সমস্ত সত্তার জন্য পর্যবেক্ষণযোগ্য সংগ্রহগুলি পেতে টিটি ফাইলটি সংশোধন করেছি, যে কোনও সহায়তা স্বাগত।
ব্যবহারকারী 2475096

2
@ লেন্নি 32 কি এই এক্সটেনশনটি সম্পর্কে সচেতন হতে হবে?
অ্যারন হুডন

মনে রাখবেন যে আপনি যে সম্পত্তিটি নেভিগেট করছেন সেই ডিবিসেটের সাথে আপনি যে ন্যাভিগেশন করেছেন সেগুলি যদি একের পর এক হয় তবে এটি প্রয়োজনীয় নয় এবং আপনি DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)কেবল কারটিশিয়ান পণ্য গণনা করছেন এবং সম্ভাব্য ব্যান্ডউইদথ বাড়িয়ে দিচ্ছেন এমন একমাত্র ব্যর্থতা দিয়ে আপনি শৃঙ্খলা করতে পারেন ।
জন জাব্রোস্কি

23

এমএসডিএন-এর আরও ইএফসিওর উদাহরণ দেখায় যে আপনি 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();

আপনি কীভাবে Includeপরেও চেইন করতে পারেন তা দেখুন ThenIncludeএবং এটি আপনাকে শীর্ষ স্তরের সত্তার (প্রশিক্ষক) স্তরে ফিরে 'পুনরায় সেট' করে of

এমনকি আপনি একই 'প্রথম স্তরের' সংগ্রহ (কোর্সআসাইনমেন্টস) একাধিকবার পুনরায় আলাদা আলাদা ThenIncludesকমান্ড অনুসরণ করে বিভিন্ন শিশু সত্তায় উঠতে পারেন।

নোট করুন আপনার আসল জিজ্ঞাস্যটি অবশ্যই Includeবা ThenIncludesচেইনের শেষে ট্যাগ করা উচিত । নিম্নলিখিতগুলি কাজ করে না:

var query = _context.Instructors.AsQueryable();
query.Include(i => i.OfficeAssignment);

var first10Instructors = query.Take(10).ToArray();

আপনি লগিং সেট আপ করার দৃ strongly়তার সাথে সুপারিশ করবেন এবং নিশ্চিত করুন যে আপনি যদি এক বা দুটি জিনিস যুক্ত করে থাকেন তবে আপনার প্রশ্নগুলি নিয়ন্ত্রণের বাইরে নেই। এটি বাস্তবে কীভাবে কাজ করে তা দেখতে গুরুত্বপূর্ণ - এবং আপনি প্রত্যেকে আলাদা করে দেখবেন 'অন্তর্ভুক্ত' সাধারণত অনর্থক ডেটা প্রত্যাবর্তনকারী বৃহত্তর যোগদানগুলিকে এড়ানোর জন্য একটি নতুন কোয়েরি।

AsNoTracking আপনি প্রকৃতপক্ষে সত্তাগুলি সম্পাদনা এবং পুনরায় সংরক্ষণ করতে চান না যদি জিনিসগুলিকে ব্যাপকভাবে গতিতে পারে।


আপনার পুনরাবৃত্তি ছাড়াই তালিকাভুক্তি এবং ডিপার্টমেন্টগুলি উভয়ই পাওয়ার কোনও উপায় আছে? কোর্সঅ্যাসাইনমেন্ট এবং কোর্সের জন্য অন্তর্ভুক্ত? (এখনও অবধি, মনে হচ্ছে এপি আরও গভীর থেকে যেতে পারে henতখন অন্তর্ভুক্ত করুন, বা দিয়ে শীর্ষ স্তরে ফিরে যেতে পারেন nc অন্তর্ভুক্ত করুন, তবে একই স্তরে থাকার কিছু নেই?)
উইলিয়াম জোকাস

আপনি যদি ইএফ কোর ২.১ ব্লগস.এমএসএনএন.মাইক্রোসফট.ডটনেটস / ডটনেট /৮ / ২২ // ২ এর জন্য অলস-লোডিং থাকুন চান তবে তবে আপনি যদি একই স্তরে আরও বেশি লোড করতে চান তবে আমার মনে হয় এটি নকশা দ্বারা। আপনি কী ভাবছেন তা আমি নিশ্চিত নই - এটি করার জন্য এর জন্য অতিরিক্ত অতিরিক্ত প্রয়োজন হয় না এবং এটি ডাটাবেস থেকে ফিরে আসা বিষয়টিকে খুব হ্রাস করে। কোনও সত্তার কাছে কেবল একটি বা দুটি 'সম-স্তরের' জিনিস থাকতে পারে তবে এটি একটি বৃহত প্রকল্পের জন্য 50 টিও থাকতে পারে, স্পষ্টত আপনার অ্যাপ্লিকেশনটিকে আরও দ্রুত করে তোলে।
সাইমন_উইভার

এটি স্তরটিকে আবার প্রাথমিক স্তরে ফিরে "পুনরায় সেট করা" এর ধারণার একটি ভাল ব্যাখ্যা ছিল। অন্তর্ভুক্ত সিস্টেমের উত্তরাধিকারের চারপাশে আমাকে আমার মাথা গুটিয়ে রাখতে সহায়তা করেছে। চিয়ার্স!
এএফএম-দিগন্ত

22

আমাকে একাধিক অন্তর্ভুক্তও ব্যবহার করতে হয়েছিল এবং তৃতীয় স্তরে আমার একাধিক সম্পত্তি প্রয়োজন

(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();

এটি কাউকে সাহায্য করতে পারে :)


1
এটি কি পুনরাবৃত্তি না করেই করা যায়.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
মাল্টিনার্ড

ভাল এটি নির্ভর করে, আপনি কত গভীর যেতে চান
dnxit

7

আমাকে এটিকে স্পষ্টভাবে বলতে চাই যে আপনি যদি স্ট্রিং ল্যাটারালগুলি ব্যবহার করতে আপত্তি না করেন তবে সংশ্লিষ্ট সম্পর্কের গুণাগুণ নির্বিশেষে নেস্টেড স্তরগুলি অন্তর্ভুক্ত করতে আপনি স্ট্রিং ওভারলোড ব্যবহার করতে পারেন:

query.Include("Collection.Property")

1
এই পদ্ধতিটি ভিবিতে কীভাবে কোড করা যায় তা নির্ধারণের জন্য আমার পক্ষে সহায়ক ছিল, কারণ কয়েক ঘন্টা গুগল করার পরে আমি কোথাও খুঁজে পাই না।
কোডার

এটি আমার পক্ষে দুর্দান্ত কাজ করে, আমি এটি অনেক ব্যবহার করি !!! এটি এমনকি .সংশ্লিষ্ট নির্বাচনী বিবৃতিগুলির সাথে মিলিতভাবে কাজ করে:query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...
এফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.