1

ObjectSet のメソッドを使用して、テーブル内でさまざまなクエリを実行しています。つまり、テーブルからいくつかのレコードを選択しています。

    var results = Repository.Find(c => c.Enabled == 1).ToList();

私のリポジトリの Find メソッドは次のとおりです。

    public IEnumerable<T> Find(Func<T, bool> predicate)
    {
        try
        {
            return _objectSet.Where<T>(predicate);
        }
        catch
        {
            throw;
        }
    }

ここで、対象のテーブルに約 1,000,000 のレコードがある場合、実行しているFind呼び出しが多くても数レコードしか返さなくても、プロセスのメモリ使用量が大幅に増加することがわかります。

すべてのレコードがクライアント側で取得され、フィルタリングされたようです。これは明らかに、私が LINQ に望んでいることではありません。

私がやっていることで何か明らかに間違っていると思いますか?

前もって感謝します。

4

1 に答える 1

2

Expression<Func<T, bool>>プレーンの代わりに使用する必要があると思いますFunc<T, bool>

public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) {
  // your code
}

Whereはオーバーロードされており ( ObjectSet クラスを参照)、- Func<T>overload は によって定義されていますがIEnumerable<T>Expression<TDelegate>は によって使用されていIQueryable<T>ます。predicateは であるためFunc<T>、コンパイラは に対して定義された拡張メソッドを呼び出しますIEnumerable<T>。これにより、すべてのレコードがフェッチされ、オブジェクトへの LINQ が実行されます。

于 2013-02-08T15:10:43.090 に答える