我正在使用实体框架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
。请帮助我摆脱这个问题。
答案 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);
}