0

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

私が必要とするのは、一致するロールのみを追加でロードすることです。

最初の試み

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

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

何か案は?

4

1 に答える 1

0

積極的な読み込みを使用したフィルタリングと並べ替えはサポートされていません。1回のラウンドトリップでデータをロードする唯一の方法は、投影です。

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(「関係の修正」)の場合、フィルター処理されたRolesコレクションはそれぞれに自動的に入力されますParty(変更の追跡を無効にしない場合)。関係が多対多の場合、それはそれほど簡単には機能せず、匿名オブジェクトの結果リストを返した後、コレクションを手動で入力する必要があります。

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

于 2012-04-21T11:54:19.793 に答える