2017-08-07 17 views
0

LazyLoadEnabled = falseコンフィグレーションなしのエンティティフレームワーク6を使用しています。私のプロジェクトでUnitOfworkリポジトリパターンを使用しています。 私は約5つのテーブルとの外部キー関係を持つテーブルに約150,000のレコードを持っています。今、私の要件は、私が最初に私はいくつかの基本的なフィルタを適用した後、正確なカウントを取得(のisActiveなどを、ユーザーが作成した)以下のようにするために、この表を照会しています、そのpagination.Forサーバ側を実装する必要がある。その後、OutOfMemory Where句の例外

public long Count(Func<TEntity,bool> where) 
{ 
    return DbSet.Where(where).Count(); 
} 

Iいくつかの検索文字列フィルタを適用し、以下のようないくつかの外国の参照が含まれています:

public IQueryable<TEntity> GetWithInclude(Expression<Func<TEntity, bool>> predicate, params string[] include) 
{ 
    IQueryable<TEntity> query = this.DbSet; 
    query = include.Aggregate(query, (current, inc) => current.Include(inc)); 
    return query.Where(predicate); 
} 

が、私はWhere句を使用しているので、両方の方法で、私はOutOfMemory exceptionを取得しています。親切にもこの問題を取り除く手助けをしてください。

答えて

0

これは実際にはanswer from Danielを展開するだけです。 CountメソッドがFunc<TEntity,bool>を受け取るため、より具体的なQueryable.Whereの代わりにEnumerable.Whereを選択するように強制しています。これにより、DbSet全体がメモリーに変換されます。すべて1,500,000行です。だからではなく、Expressionを取るために、そしてあなたがそこにいる間、あなたはWhereを呼び出す必要はありません、代わりにCountの他のオーバーロードを使用するメソッドのシグネチャを変更します。

public long Count(Expression<Func<TEntity,bool>> where) 
{ 
    return DbSet.Count(where); 
} 
2

おそらく、メモリへのレコードの全負荷を避けるために、署名をExpressionに変更する必要があります。別に

public long Count(Expression<Func<TEntity,bool>> where) 

LINQは、すでにあなたが使用することができますCount演算子を持っています。