2011-09-12 12 views
4

だから、このようなクラスがあります。インクルードが機能しないなどがメンバーのIListの上EF - プロパティに含まれない理由

public class User { 
    public virtual IList<Member> Members {get;set;} 
} 

public class Member { 
    public virtual AnotherTable Another {get;set;} 
} 

public class AnotherTable { 
    public string Name {get;set;} 
} 

私は作品を含めるのDataContextに対して直接クエリを実行しますが、私はAsQueryableを(行います)。

上記のMembersプロパティのような遅延ロードされたプロパティにInclude/Eager機能を持たせる方法はありますか?または、その機能を取得するためにDataContextを必ず通過する必要がありますか?

User.Members.AsQueryable().Include(a => a.Another).ToList() // <-- nada, no way Jose 
_db.Members.Include(m => m.Another).ToList() // <-- all good in the neighborhood 

それが何かの結果と同等のための100件の問合せ対1つのSQLクエリの巨大な違いがあることができます原因私が尋ねます。

ありがとうございます。

答えて

3

AsQueryableは、エンティティへのLINQクエリを作成しません。それはまだListの上にLinqからオブジェクトへのクエリです。 ListIncludeを処理する方法を知っていない - あなたがDbQueryを取得する必要がありますので、唯一のDbQueryはそれを知っている:

var entry = context.Entry(user); 
entry.Collection(u => u.Member).Query().Include(m => m.Another).Load(); 
0

Include()が機能するには、DbContextを経由する必要があります。それをリポジトリに抽象化することはできますが、引き続きInclude()式を基になるコンテキストに渡す必要があります。

private IQueryable<T> GetQuery<T>(params Expression<Func<T, object>>[] includeProperties) where T : class 
    { 
     IQueryable<T> query = _db.Set<T>(); 

     if (includeProperties != null) 
     { 
      foreach (Expression<Func<T, object>> expression in includeProperties) 
      { 
       query = query.Include(expression); 
      } 
     } 

     return query; 
    } 
+0

これは答えに対する良い解決策です。私は一般的なクエリシナリオのために私のdatacontextに特化したプロパティを作成しました。しかしこれを実装することもできます。 –

-1

私も同じ問題に直面しました。

私は名前空間以下参照System.Data.Entity &使用を追加し、これを解決:

using System.Data.Entity; 

あなたはそれを試すことができます。

関連する問題