jps*_*ook 8 c# asp.net pagination entity-framework repository
我首先使用EF4代码,并拥有持久性存储库和与之交互的服务层.我有一个服务层方法,它在我的存储库上调用IQueryable方法并返回包含实体的IEnumerable.我还需要返回总记录数,以便我可以计算分页链接.
我应该如何从我的服务方法返回int和IEnumerable?
所有这些都应该有效,但哪一个最干净?
更新: 这是对架构的一些澄清.如果这是错误的,请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)
回购层:
返回DbSet的IQueryable,从表示层抽象出db访问
服务层:
对IQueryable执行LINQ查询以进行过滤,并根据需要使用skip和take获取页面项并返回IEnumerable(返回时也设置为List以避免任何DbContext生命周期问题)
表示层:
在Service层上调用该方法(getPagedResults(filters,pageNumber,pageSize))
从它的外观来看,我还需要添加一个单独的方法来获得总结果.希望能在一个电话中完成这一切.
我宁愿不将所有记录带回演示文稿,然后页面......似乎效率低下.
你可以做这样的事情
public class Repository<TEntity>
{
public IEnumerable<TEntity> GetCollection(Expression<Func<TEntity, bool>> filter,
int pageSize, int pageIndex)
{
return YourDbSet.Where(filter).OrderBy(sortExpression).Skip(pageSize * pageIndex).Take(pageSize);
}
public int Count(Expression<Func<TEntity, bool>> filter)
{
return YourDbSet.Where(filter).Count();
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以编写扩展方法来使用这两种方法
public static Pagination<TEntity> GetPagination<TEntity>(this Repository<TEntity> repository,
Expression<Func<TEntity, bool>> filter, int pageSize, int pageIndex)
{
var entities = repository.GetCollection(filter, pageSize, pageIndex);
var count = repository.Count(filter);
return new Pagination(entities, pageSize, pageIndex + 1, count);
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以独立重用GetCollection
和使用Count
方法.您可以动态构建where条件.看看我的回答