1. ホーム
  2. linq

[解決済み] エンティティフレームワークのLinqクエリInclude()複数の子エンティティ

2022-04-20 01:13:31

質問

これは本当に要素的な質問かもしれませんが、3つのレベル(またはそれ以上)にまたがるクエリを書くときに、複数の子エンティティを含めるにはどのような方法がありますか?

例えば、4つのテーブルがあります。 Company , Employee , Employee_CarEmployee_Country

Company は Employee と 1:m の関係を持ちます。

Employee は Employee_Car および Employee_Country の両方と 1:m の関係を持っています。

4つのテーブルのデータをすべて返すクエリを書きたい場合、現在書いているのはこれです。

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

もっとエレガントな方法があるはずだ! これは長ったらしい上に、恐ろしいSQLを生成します。

私はEF4をVS 2010で使用しています。

どのように解決するのですか?

使用方法 拡張メソッド . 置換 名前OfContext をオブジェクトコンテキストの名前に置き換えます。

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