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

标签 c# asp.net entity-framework pagination repository

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

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

  • 在总行数的方法上使用 out 参数
  • 创建一个单独的类,将总行数作为属性包含在内
  • 将分页 LINQ 查询移出服务层(从服务层的存储库公开 IQueryable)
  • 在服务层上创建一个完全独立的方法来执行新的计数查询。

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

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

repo 层:

返回DbSet的IQueryable,从表示层抽象出数据库访问

服务层:

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

然后你可以写一个扩展方法来使用这两种方法

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

这样您就可以独立地重用 GetCollectionCount 方法。 您可以动态构建 where 条件。看看我的answer

关于c# - 我应该如何从我的服务层方法中公开总记录数和分页记录的 IEnumerable 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6417886/

相关文章:

c# - 如何保存每周、每两周和每月的订单

c# - 如何使用jquery进行更多控制?

c# - 允许用户将 html 列表的内容保存到文本文件

asp.net-mvc - 如何为启用延迟加载的 MVC 应用程序应用事务隔离级别?

entity-framework - 使用 postgresql 和 postGIS 的 Entity Framework 中的空间/几何类型

c# - LINQ 左外部联接 - 对象引用未设置为对象的实例

c# - 在 C# 中使用 LINQ 解析 XML

c# - 如何将此 Linq 查询语法转换为方法语法?

c# - 将通用 C# 代码添加到 SharePoint 2010 网站页面

entity-framework - 在 Entity Framework 中包含子对象