2017-08-07 2 views
0

J'utilise entity Framework 6 avec la configuration LazyLoadEnabled = false rien d'autre.J'utilise le modèle de référentiel UnitOfwork dans mon projet. Et j'ai environ 1,50,000 enregistrements dans un tableau avec des relations clés étrangères à environ 5 tables. Maintenant, mon exigence est que je dois mettre en œuvre côté serveur pagination.For que, d'abord j'Interrogation ce tableau pour obtenir le nombre exact après l'application de certains filtres de base (comme isActive et créé par l'utilisateur) comme ci-dessous:Exception OutOfMemory pour la clause Where

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

je je applique un certain filtre à chaîne de recherche et inclure des références étrangères comme ci-dessous:

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); 
} 

mais dans les deux méthodes, je reçois OutOfMemory exception depuis que je l'ai utilisé Where article. Veuillez m'aider à me débarrasser de ce problème.

Répondre

0

Ceci est vraiment juste pour développer le answer from Daniel. Parce que votre méthode Count prend un Func<TEntity,bool>, vous obligez le compilateur à choisir Enumerable.Where au lieu du Queryable.Where plus spécifique. Cela force la totalité de votre DbSet à se matérialiser en mémoire - toutes les 1 500 000 lignes. Donc, changer la signature de la méthode pour prendre une place Expression, et pendant que vous êtes là, vous n'avez pas besoin d'appeler Where, utilisez plutôt l'autre surcharge de Count:

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

Peut-être que vous devriez changer votre signature pour inclure Expression pour éviter la pleine charge des enregistrements en mémoire.

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

En plus: LINQ a déjà un opérateur Count que vous pouvez utiliser.