Where子句的OutOfMemory异常

时间:2017-08-07 12:52:28

标签: c# sql entity-framework out-of-memory

我正在使用实体框架6而没有配置LazyLoadEnabled = false配置。我在我的项目中使用UnitOfwork存储库模式。 我在一张表中有大约1,50,000条记录,外键关系大约有5个表。现在我的要求是我必须实现服务器端分页。为此,首先我在应用一些基本过滤器(如isactive和用户创建)之后查询此表以获得精确计数,如下所示:

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。请帮助我摆脱这个问题。

2 个答案:

答案 0 :(得分:2)

也许您应该更改签名以包含Expression,以避免将记录完全加载到内存中。

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

除此之外: LINQ已经有一个Count运算符供您使用。

答案 1 :(得分: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);
}