【发布时间】:2011-09-19 01:27:06
【问题描述】:
我首先使用带有代码的 EF4,并且有一个用于持久性的存储库和一个与之交互的服务层。我有一个服务层方法,它在我的存储库上调用一个 IQueryable 方法并返回一个包含实体的 IEnumerable。我还需要返回总记录数,以便计算分页链接。
我应该如何从我的服务方法中返回 int 和 IEnumerable?
- 在方法上使用 out 参数计算总行数
- 创建一个包含总行数作为属性的单独类
- 将分页 LINQ 查询移出服务层(从服务层的存储库中公开 IQueryable)
- 在服务层上创建一个完全独立的方法,该方法只针对计数执行新查询。
所有这些都应该有效,但哪一个最干净?
更新:以下是对架构的一些说明。如果这是错误的,那么请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)
回购层:
返回 DbSet 的 IQueryable,从表现层抽象出对 db 的访问
服务层:
对 IQueryable 执行 LINQ 查询以过滤并根据需要使用 skip 和 take 获取页面项目并返回 IEnumerable(在返回时还将设置为 List 以避免任何 DbContext 生命周期问题)
表示层:
调用Service层上的方法(getPagedResults(filters, pageNumber, pageSize))
从外观上看,我还需要添加一个单独的方法来获得总结果。希望在一个电话中完成这一切。
我不希望将所有记录都带回演示文稿,然后页面...似乎效率低下。
【问题讨论】:
-
如果您已经返回
IEnumerable<T>,是否有某些特定原因您不只是在IEnumerable上使用.Count()?您只是将子集呈现给前端吗?前端不应该负责分页吗? -
你返回的IEnumerable,它包含所有的项目吗? (与 count 将返回的项目数量相同)
-
@AllenG - 我在服务层本身进行分页,然后将列表返回给 UI/Codebehind 消费者。这样我就可以避免我的 Dbcontext 生命周期出现任何问题。此外,我不必将所有记录发送到前端,然后进行分页.. 将直接在服务层查询中获取我需要的记录。
-
@Magnus - 我试图避免发送所有项目......只需通过对从 repo 返回的 IQueryable 进行查询来获取我需要的项目。
-
更新问题以添加更多信息。
标签: c# asp.net entity-framework pagination repository