我应该如何从我的服务层方法公开总记录数和分页记录的 IEnumable 集合?
我首先将 EF4 与代码一起使用,并拥有一个用于持久性的存储库和一个与其交互的服务层。我有一个服务层方法,它在我的存储库上调用 IQueryable 方法并返回包含实体的 IEnumerable。我还需要返回总记录数,以便计算分页链接。
我应该如何从我的服务方法返回 int 和 IEnumerable?
- 在总行数的方法上使用 out 参数
- 创建一个单独的类,其中包含总行数作为属性
- 将分页 LINQ 查询移出服务层(从服务层上的存储库公开 IQueryable)
- 创建完整的服务层上的单独方法仅针对计数执行新查询。
所有这些都应该有效,但哪一个是最干净的呢?
更新:以下是架构的一些说明。如果这是错误的,那么请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)
Repo 层:
返回 DbSet 的 IQueryable,从表示中抽象数据库访问层
服务层:
在 IQueryable 上执行 LINQ 查询以进行过滤,并根据需要使用skip 和 take 获取页面项,并返回 IEnumerable(返回时还将设置为 List 以避免任何 DbContext 生命周期)问题)
表示层:
调用服务层上的方法 (getPagedResults(filters, pageNumber, pageSize))
从表面上看,我还需要添加一个单独的方法来获取总结果。希望通过一次通话就能完成这一切。
我不想将所有记录带回演示文稿,然后页面...似乎效率低下。
I am using EF4 with code first and have a repository for persistence and a service layer that interacts with it. I have a service layer method that calls a IQueryable method on my repository and returns a IEnumerable containing the entities. I also need to return the total record count so I can calculate the paging links.
How should I return both the int and IEnumerable from my service method?
- Use a out parameter on the method for the total row count
- Create a separate class that includes the total row count as a property
- Move the paging LINQ query out of the service layer (expose the IQueryable from the repo on the service layer)
- Create a full separate method on the service layer that does a new query just for count.
All of these should work, but which one is the cleanest?
UPDATE: Here is some clarification of the architecture. If this is wrong, then please tell me better way (eg - do the paging in the presentation layer instead of service layer,etc)
Repo layer:
returns IQueryable of DbSet, abstracts the db access from the presentation layer
Service layer:
does a LINQ query on the IQueryable to filter and just get the page items as needed using skip and take and returns a IEnumerable (going to also set to List on return to avoid any DbContext lifetime issues)
Presentation layer:
Call the method on the Service layer (getPagedResults(filters, pageNumber, pageSize))
From the looks of it I will also need to add a separate method to get the total results. Was hopeing to do this all in one call.
I would prefer not to bring back all the records to presentation and then page... seems inefficient.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以这样做
,然后您可以编写一个扩展方法来使用这两个方法
,这样您就可以独立地重用
GetCollection
和Count
方法。您可以动态构建 where 条件。看看我的答案
You can do something like this
Then You can write an extension method to use both of these methods
This way you can reuse
GetCollection
andCount
methods independently.You can build the where condition dynamically. Take a look at my answer
如果您返回的
Enumerable
包含所有项目,我会在从函数返回 if 之前对其执行ToList()
操作。 (然后您可以免费进行Count
)如果函数返回总数的子集(使用
Skip
和take
),我将添加一个单独的函数来获取总数。If the
Enumerable
you are returning contains all the items, I would do aToList()
on it before returning if from the function. (you can then doCount
with no cost on it)If the function is returning a sub set of the total (using
Skip
andtake
) I would add a seperate function to get the total count.