我应该如何从服务层方法中公开总记录数和IEnumable分页记录集合?

jps*_*ook 8 c# asp.net pagination entity-framework repository

我首先使用EF4代码,并拥有持久性存储库和与之交互的服务层.我有一个服务层方法,它在我的存储库上调用IQueryable方法并返回包含实体的IEnumerable.我还需要返回总记录数,以便我可以计算分页链接.

我应该如何从我的服务方法返回int和IEnumerable?

  • 在方法上使用out参数来计算总行数
  • 创建一个单独的类,其中包括总行数作为属性
  • 将分页LINQ查询移出服务层(从服务层上的repo中公开IQueryable)
  • 在服务层上创建一个完全独立的方法,只为count执行新查询.

所有这些都应该有效,但哪一个最干净?

更新: 这是对架构的一些澄清.如果这是错误的,请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)

回购层:

返回DbSet的IQueryable,从表示层抽象出db访问

服务层:

对IQueryable执行LINQ查询以进行过滤,并根据需要使用skip和take获取页面项并返回IEnumerable(返回时也设置为List以避免任何DbContext生命周期问题)

表示层:

在Service层上调用该方法(getPagedResults(filters,pageNumber,pageSize))

从它的外观来看,我还需要添加一个单独的方法来获得总结果.希望能在一个电话中完成这一切.

我宁愿不将所有记录带回演示文稿,然后页面......似乎效率低下.

Era*_*nga 8

你可以做这样的事情

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条件.看看我的回答