2017-08-07 104 views
0

我正在使用實體框架6與LazyLoadEnabled = false配置沒有別的。我在我的項目中使用UnitOfwork存儲庫模式。 而且我有大約1,50,000條記錄在一個外鍵關係約5個表的表中。現在,我的要求就是我要實現服務器端pagination.For,首先我查詢這個表應用一些基本的過濾器後能得到確切的數(如isactive和用戶創建的)象下面這樣:OutOfMemory異常Where條款

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

然後我正在申請某些搜索字符串過濾器和包括像下面的一些外國文獻:

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

但在這兩種方法中,我越來越OutOfMemory exception,因爲我已經使用Where條款。請幫我擺脫這個問題。

回答

0

這真的只是爲了擴大answer from Daniel。由於您的Count方法需要Func<TEntity,bool>,因此您迫使編譯器選擇Enumerable.Where而不是更具體的Queryable.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操作,您可以使用。