2017-03-21 6 views
0

私のスキーマが含まれています:Entity Frameworkの6 - 派生型の子プロパティが含ま

  • loanApplicationなど(親オブジェクト)
  • 借り手(子オブジェクトとして派生型BusinessBorrowerIndividualこと)多対多の
  • BorrowersOwnerManagersを(
  • OwnerManager(借手との多対多リレーションシップの一部)
  • OwnerManagerIndividual(派生タイプからの派生タイプ) OwnerManager)
  • OwnerManagerBusiness(OwnerManagerからの派生型)
  • OwnerManagerIndividualsRaceTypes(多対多、私はそれがカスタム監査特性を有しているので、明示的に定義する必要があります)
  • RaceType(と多対多の関係の一部OwnerManagerIndividual)

私はloanApplicationなどのための私のリポジトリに次のように使用してみました:

public ILoanApplication GetById(int id) 
{ 
    ILoanApplication item; 


    using (var db = new MainContext()) 
    { 
     item = db.LoanApplications 
      .Include(c => c.Borrowers) 
      .Include(c => c.Borrowers.Select(b => b.BusinessBorrowerIndividual)) 
      .Include(c => c.Borrowers.Select(b => b.BorrowersOwnerManagers)) 
      .Include(c => c.Borrowers.Select(b => b.BorrowersOwnerManagers.Select(bb => bb.OwnerManager))) 
      .Include(c => c.Borrowers.Select(b => b.BorrowersOwnerManagers.Select(bb => bb.OwnerManager) 
                          .OfType<OwnerManagerIndividual>() 
                          .Select(o => o.OwnerManagerIndividualsRaceTypes))) 
      .FirstOrDefault(l => l.Id == id); 
    } 

    return item; 
} 

すべてがを除いて動作します最後のインクルード。私はそれを使用するとき、私は次のエラーが表示されます

インクルードパス式は、ナビゲーションプロパティ タイプに定義されたを参照する必要があります。参照ナビゲーション のプロパティとコレクションのナビゲーションのSelect演算子 プロパティには、点線のパスを使用します。パラメータ名:path

OwnerManagerIndividualタイプのOwnerManagerオブジェクトにOwnerManagerIndividualsRaceTypesプロパティを含めることができるように更新するにはどうすればよいですか?また、OwnerManagerIndividualかOwnerManagerBusinessかどうかに関係なく、すべてのOwnerMangerオブジェクトを含めることもできます。

**アップデート** 応答に基づいて、1回の呼び出しで簡単には実行できないようです。私はエレガントな解決策ではありませんこれは、移入するために二次の呼び出しを行うために提案していく​​。代わりに遅延読み込みのためにそれらを残しての熱心負荷のプロパティ:

public ILoanApplication GetById(int id) 
{ 
    var ownerManagerIndividualRepository = new OwnerManagerIndividualRepository(UserOrProcessName); 
    ILoanApplication item; 


    using (var db = new MainContext()) 
    { 
     item = db.LoanApplications 
      .Include(c => c.Borrowers) 
      .Include(c => c.Borrowers.Select(b=> b.BusinessBorrowerIndividual)) 
      .Include(c => c.Borrowers.Select(b => b.BorrowersOwnerManagers)) 
      .Include(c => c.Borrowers.Select(b => b.BorrowersOwnerManagers.Select(bb => bb.OwnerManager))) 
      .FirstOrDefault(l => l.Id == id); 
    } 

    if (item?.Borrowers?.Count > 0 && 
     item.Borrowers.FirstOrDefault().BorrowersOwnerManagers.Any(o => o.OwnerManager.IsIndividual)) 
    { 
     foreach (var owners in item.Borrowers.FirstOrDefault().BorrowersOwnerManagers.Where(o => o.OwnerManager.IsIndividual)) 
     { 
      var owner = ownerManagerIndividualRepository.GetById(owners.OwnerManager.Id.Value); 

      foreach (var type in owner.OwnerManagerIndividualsRaceTypes) 
      { 
       ((OwnerManagerIndividual)owners.OwnerManager).OwnerManagerIndividualsRaceTypes.Add((OwnerManagerIndividualsRaceTypes)type); 
      } 
     } 
    } 


    return item; 
} 
+0

ために同様の質問を確認することができますあなたはの別のインスタンスを取得します実現しますBusinessBorrowersOwnerManagersは毎回? 最後のビットを別のクエリで取得して辞書を作成し、手動で添付することをお勧めします。 –

+0

残念ながら、派生したエンティティのプロパティを含めることはできません。 – DavidG

+0

私はセカンドコールを反映させるために更新されたセクションを追加しました。これは優雅なソリューションではありませんが、動作するようです。 – Josh

答えて

1

.Include()拡張子が1つだけの目的を果たします。これはクエリービルダーがJOINをSQLに含めるためのオプションにすぎず、他のものではありません。

Includeの式の中でフィルタリングを提供しようとしていますが、これは間違っています。実際に私はそれがEFで単一のクエリで容易になんとかだか分からないインナーコレクションのフィルタリング部分をどのように達成するかについては

、あなたは一例How to filter nested collection Entity Framework objects?

+0

OfTypeは.Include()でサポートされていませんか? – Josh

+0

@Josh正確に。プロパティパスと 'Select'のみ。 – Lanorkin

関連する問題