0

Generic Repository like パターンを使用してデータを取得しています。100 以上のエンティティがあるため、それぞれに個別のリポジトリを作成することは実際にはオプションではありません。同じクラスのいくつかの関数を次に示します。

    public int Count(Func<TEntity, bool> x=null)
    {
        return x == null ?
            mgr.CTX.GetAll<TEntity>().Count() :
            mgr.CTX.GetAll<TEntity>().Where(x).Count();
    }

    public TEntity One(Func<TEntity, bool> x)
    {
        return mgr.CTX.GetAll<TEntity>().Where(x).Take(1).FirstOrDefault();
    }

    public IQueryable<TEntity> All(Func<TEntity, bool> x=null)
    {
        return x == null ?
            mgr.CTX.GetAll<TEntity>() :
            mgr.CTX.GetAll<TEntity>().Where(x).AsQueryable<TEntity>();
    }

問題は、どの関数が呼び出されても、Sql プロファイラーが同じことを示していることです。

[テーブル] から [列] を選択

Take(1) または Count() または Where() を使用する場合、 SelectのCount()TopまたはWhere句を使用してクエリを作成する必要があると思いますが、これらの関数はクエリの生成にまったく影響しません。どうやら、サーバーからすべてのデータをフェッチした後、すべての操作がメモリ内で実行されるようです。

アクセス方法に問題がある場合、またはこれがテレリックの通常の動作である場合は、ガイドしてください。

4

1 に答える 1

1

あなたは LINQ 拡張メソッドの定義の微妙な違いの犠牲になっていると思います.in-memory はFunc<>SQL にバインドさExpression<>れたパラメーター型として使用されます。
私の提案はに変更All(Func<TEntity, bool> x=null)することですAll(Expression<Func<TEntity, bool>> x=null)

于 2014-12-29T08:45:49.460 に答える