2012-04-21 6 views
0

DbContext/DbSet/DbQueryを使用して、条件付きで欲しいナビゲーションプロパティを読み込むことは可能ですか?以下のクエリは、特定の役割を持つ関係者を返します。EFコード先頭4.3条件付きロードナビゲーションプロパティ

私が必要とするのは、さらに一致する役割だけを追加することです。

最初の試み

var peopleWithRole = (from p in Party 
    from r in p.Roles 
    where r.RoleTypeId == 1 
    select p).Include(_ => _.Roles); 

これは、すべてのロールをロードし、そしてあなたがそれを見たら、なぜそれは明らかです。

私はいくつかのことを試しました。それを行うためにオブジェクトクエリーをキャストして作成しなければならない場合、私は方法を理解できません。

第二の試み

var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
var set = objectContext.CreateObjectSet<Party>(); 
var result = (from p in set.Where("it.Roles.RoleTypeId == 1") 
       select p) 
; 
result.Dump(); 

イテレータは、次のように使用することはできませんか?

アイデア?

+0

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-relatedentity.aspx – Jim

答えて

0

eager loadingによるフィルタリングと並べ替えはサポートされていません。単一ラウンドトリップでデータをロードする唯一の方法は、投影である:

var peopleWithRole = (from p in Party 
         select new 
         { 
          Party = p, 
          Roles = p.Roles.Where(r => r.RoleTypeId == 1) 
         }) 
         .ToList() 
         .Select(a => a.Party); 

関係があれば、1対多数のEF(「リレーションシップ・フィックスアップ」)は(各Partyに自動的濾過Rolesコレクションを移入します場合変更追跡を無効にしないでください)。関係が多対多である場合、それは簡単には機能しません。匿名オブジェクトの結果リストを返すと、手動でコレクションを満たす必要があります。

最後のオプションは、ここで熱心なローディングフィルタリング機能に投票することです:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-extension-method ...将来のEFリリースで実装されることを願っています。

+0

結局この結論に至りました。それを確認していただきありがとうございます。私は彼らが機能を追加することを願っています。 – Jim

+0

これは実際に今できるように見えるかもしれません。私はそれを確認するためにテストします、私はちょうどこのリンクを発見した。 http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx – Jim

+0

@Jim:いいえフィルタリングは、明示的な読み込み*(= 2つのDBクエリ)でのみ可能であり、熱心な読み込みではできません。 EF 5(ベータ版)では積極的な読み込みでフィルタリングすることはできませんが、我々はまだ待つ必要があります... – Slauma