【发布时间】:2011-07-10 18:58:46
【问题描述】:
背景
我正在使用工作单元/存储库模式开发 Web 应用程序。我选择了一个与存储库交互的服务层。存储库返回 IQueryable 给服务层,服务层返回 List 给控制器。
我决定不将 IQueryable 返回到控制器,以确保查询将被重用并放置在正确的层 - 服务层。也因为以后可能需要网络服务。
问题
在控制器级别允许分页和排序而不在控制器级别公开 IQueryable 的最佳方法是什么?
一种选择是向所有可能返回多个实体的服务函数添加参数,但这似乎并不理想。或者,我仍然可以对返回的列表进行分页,但这会导致大量不必要的数据访问。
编辑澄清
我的存储库具有如下功能:
public IQueryable<T> GetAll()
{
return objectSet;
}
我的服务具有如下功能:
public List<Person> GetAllPeople()
{
return repository.GetAll().ToList()
}
我很高兴存储库将 IQueryable 返回到服务,因为这允许服务具有以下功能:GetPersonByName、GetPersonByEmail 等
但我正在寻找一种替代方法,而不是仅在“PageNumber”和“PageSize”参数之上提供 GetAllPeople 函数。
【问题讨论】:
-
我会传递参数以在服务层对列表进行分页,例如 PageSize、total 等。而不是在控制器上进行。
-
IEnumerable
只允许分页 once 据我了解,所有内容都已加载到内存中。如果有大量行,这将是有问题的。 -
仅通过 Enumerable
返回类型返回 IQueryable 类型不会被拉入内存。你实际上必须做一些事情来触发延迟查询的执行,比如调用 ToList()。
标签: c# asp.net-mvc linq iqueryable