সত্তা ফ্রেমওয়ার্ক লিংক ক্যোয়ারীতে একাধিক শিশু সত্তা অন্তর্ভুক্ত করুন ()


176

এটি সত্যিই প্রাথমিক প্রশ্ন হতে পারে তবে তিন স্তরের (বা আরও) বিস্তৃত ক্যোয়ারী লেখার সময় একাধিক শিশু সত্তাকে অন্তর্ভুক্ত করার কী দুর্দান্ত উপায়?

অর্থাত 4 টেবিল আছে: Company, Employee, Employee_CarএবংEmployee_Country

কর্মচারীর সাথে কোম্পানির একটি 1: মি সম্পর্ক রয়েছে।

কর্মচারীর কর্মচারী_কার এবং কর্মী_কাউন্ট্রি উভয়ের সাথেই 1: মি সম্পর্ক রয়েছে।

যদি আমি একটি কোয়েরি লিখতে চাই যা 4 টি সারণী থেকে ডেটা ফেরত দেয় তবে আমি বর্তমানে লিখছি:

Company company = context.Companies
                         .Include("Employee.Employee_Car")
                         .Include("Employee.Employee_Country")
                         .FirstOrDefault(c => c.Id == companyID);

আরও মার্জিত উপায় হতে হবে! এটি দীর্ঘ বাতাসযুক্ত এবং ভয়াবহ এসকিউএল উত্পন্ন করে

আমি ভিএস 2010 এর সাথে ইএফ 4 ব্যবহার করছি

উত্তর:


201

এক্সটেনশন পদ্ধতি ব্যবহার করুন । আপনার অবজেক্ট প্রসঙ্গের নামের সাথে নামঅফকনটেক্সট প্রতিস্থাপন করুন ।

public static class Extensions{
   public static IQueryable<Company> CompleteCompanies(this NameOfContext context){
         return context.Companies
             .Include("Employee.Employee_Car")
             .Include("Employee.Employee_Country") ;
     }

     public static Company CompanyById(this NameOfContext context, int companyID){
         return context.Companies
             .Include("Employee.Employee_Car")
             .Include("Employee.Employee_Country")
             .FirstOrDefault(c => c.Id == companyID) ;
      }

}

তারপরে আপনার কোড হয়ে যায়

     Company company = 
          context.CompleteCompanies().FirstOrDefault(c => c.Id == companyID);

     //or if you want even more
     Company company = 
          context.CompanyById(companyID);

তবে আমি এটির মতো এটি ব্যবহার করতে চাই: //inside public static class Extensions public static IQueryable<Company> CompleteCompanies(this DbSet<Company> table){ return table .Include("Employee.Employee_Car") .Include("Employee.Employee_Country") ; } //code will be... Company company = context.Companies.CompleteCompanies().FirstOrDefault(c => c.Id == companyID); //same for next advanced method
হামিদ

বুলসে নিক। এক্সটেনশানগুলির জন্য কলটির প্রথম বন্দর হওয়া উচিত ... ভাল ... পূর্বনির্ধারিত কার্যকারিতা প্রসারিত করা।
কম

12
বছরগুলি পরে, আমি স্ট্রিং-ভিত্তিক অন্তর্ভুক্ত করার পরামর্শ দেব না, কারণ তারা রানটাইম নিরাপদ নয়। যদি নেভিগেশন সম্পত্তির নামটি কখনও পরিবর্তন হয় বা ভুল বানান থাকে তবে তা ভঙ্গ হবে। এর পরিবর্তে টাইপযুক্ত অন্তর্ভুক্ত ব্যবহারের দৃ St়ভাবে পরামর্শ দিন।
জেফ পুতজ

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

সংশ্লেষিত প্রশ্নের জন্য কমপক্ষে এক্সটেনশন পদ্ধতির কৌশল কাজ করে না (কমপক্ষে ইএফসিওরে নয়) এখানে নিশ্চিত হয়েছে: github.com/aspnet/EntityFrameworkCore/issues/7016
ডুঞ্জ

156

EF 4.1 থেকে EF 6

একটি দৃ strongly়ভাবে টাইপ করা হয়েছে.Include যা আগ্রহী লোডিংয়ের প্রয়োজনীয় গভীরতাটিকে যথাযথ গভীরতায় সিলেক্ট এক্সপ্রেশন সরবরাহ করে নির্দিষ্ট করা যায়:

using System.Data.Entity; // NB!

var company = context.Companies
                     .Include(co => co.Employees.Select(emp => emp.Employee_Car))
                     .Include(co => co.Employees.Select(emp => emp.Employee_Country))
                     .FirstOrDefault(co => co.companyID == companyID);

উভয় দৃষ্টিতে উত্পন্ন SQLটি কোনওভাবেই স্বজ্ঞাত নয়, তবে যথেষ্ট পারফরম্যান্ট বলে মনে হচ্ছে। আমি এখানে গিটহাবের উপর একটি ছোট উদাহরণ রেখেছি

EF কোর

মতিন কোর একটি নতুন এক্সটেনশন পদ্ধতি রয়েছে .ThenInclude(), যদিও সিনট্যাক্স হয় কিছুটা ভিন্ন :

var company = context.Companies
                     .Include(co => co.Employees)
                           .ThenInclude(emp => emp.Employee_Car)
                      ...

দস্তাবেজগুলি অনুসারে, .ThenIncludeআপনার অস্বীকৃতি রক্ষা করতে আমি অতিরিক্ত 'ইনডেন্ট' রাখব ।

অপ্রচলিত তথ্য (এটি করবেন না):

একাধিক নাতি নাতি-নাতনি লোড এক ধাপে করা যেতে পারে, তবে পরবর্তী নোডটি শিরোনামের আগে গ্রাফটি ব্যাকআপের পরিবর্তে উল্টানো দরকার (এনবি: এটি এতে কাজ করে না AsNoTracking()- আপনি রানটাইম ত্রুটি পাবেন):

var company = context.Companies
         .Include(co => 
             co.Employees
                .Select(emp => emp.Employee_Car
                    .Select(ec => ec.Employee)
                    .Select(emp2 => emp2.Employee_Country)))
         .FirstOrDefault(co => co.companyID == companyID);

সুতরাং আমি প্রথম বিকল্পের সাথে থাকব (পাতার সত্তা গভীরতার মডেল অনুসারে একটি অন্তর্ভুক্ত)।


4
আমি কীভাবে দৃ strongly়ভাবে টাইপ করে এটি করব তা ভাবছিলাম statements বিবৃতি অন্তর্ভুক্ত করুন। বাচ্চাদের সিলেক্ট করে প্রজেক্ট করার উত্তর ছিল!

1
আমার সমতুল্য "co.Employees.Select (...)" "সিলেক্ট করুন" এ একটি সিনট্যাক্স ত্রুটি দেখায়, বলে যে "'কর্মচারীদের' 'নির্বাচন' [বা এক্সটেনশন পদ্ধতি]" এর সংজ্ঞা নেই। আমি System.Data.Entity অন্তর্ভুক্ত করেছি। আমি কেবল যুক্ত টেবিল থেকে একটি কলাম পেতে চাই।
ক্রিস ওয়ালশ

1
আমার একটি পিতামাতার টেবিল ছিল যা একই শিশু টেবিলে দু'বার উল্লেখ করা হয়েছিল। পুরানো স্ট্রিংটিতে সিনট্যাক্স অন্তর্ভুক্ত করার সাথে সঠিক সম্পর্কের প্রিলোড করা কঠিন ছিল। এই উপায়টি আরও অনেক নির্দিষ্ট। নেমস্পেস সিস্টেমটি অন্তর্ভুক্ত করতে দয়া করে মনে রাখবেন strongly ডেটা .একটি দৃ strongly়ভাবে টাইপের জন্য অন্তর্ভুক্ত।
কার্ল

1
নেট কোর ২.১ সহ আমার নামের
স্থানটি

27

আপনার এই আগ্রহের নিবন্ধটি কোডড্লেক্স.কম এ পাওয়া যাবে

নিবন্ধটি কোয়েরি প্রকাশের একটি নতুন উপায় উপস্থাপন করেছে যা ঘোষিত গ্রাফ আকারের আকারে একাধিক সারণী বিস্তৃত হয়।

তদ্ব্যতীত, নিবন্ধটি EF প্রশ্নের সাথে এই নতুন পদ্ধতির একটি পরিপূর্ণ কর্মক্ষমতা তুলনা করে। এই বিশ্লেষণে দেখা যায় যে GBQ দ্রুত EF কোয়েরিগুলিকে ছাড়িয়ে যায়।


এটি কীভাবে বাস্তব-জগতে প্রয়োগ করা যেতে পারে?
ভিক্টর.উডাক

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