1

すべてのデータアクセスにEntityFrameworkとリポジトリパターンを使用しています。テーブルナビゲーションを使用しているときに、最初のオブジェクトを取得してナビゲーションオブジェクトのフィールドを参照すると、2つのクエリが実行されていることに気付きました。データベースには多くの関係があるため、ナビゲーションプロパティにこの手法を使用すると、パフォーマンスのオーバーヘッドが発生する可能性があります。

私はメソッドを調べましたがInclude(string tableName)、これは非常にうまく機能します(ジェネリックRPを使用していなかった場合)が、これは1つのテーブル名しか取りません。classswhere fromからtoを変更することで、これを1つのインクルードのリポジトリパターンに複製できましEntityObjectたが、リポジトリパターンを使用して1つのクエリに複数のインクルードを含めるにはどうすればよいですか?

これが私のコードです:

public class GenericRepository<T> : IRepository<T> where T : EntityObject, new()
{
    private Entities _Context;
    private ObjectSet<T> _ObjectSet;

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, string include)
    {
        // This works OK
        return this._ObjectSet.Include(include).Where(predicate);
    }

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, param string[] include)
    {
        // This will not work but is what I am trying to do
        return this._ObjectSet.Include(include).Where(predicate);
    }
}
4

1 に答える 1

9

インクルードを連鎖させることができます:

public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, param string[] include)
{
    IQueryable<T> query = this._ObjectSet;
    foreach(string inc in include)
    {
       query = query.Include(inc);
    }

    return query.Where(predicate);
}
于 2012-09-27T16:36:11.683 に答える