我们在asp.net存储库模式项目中将数据分页和排序的逻辑放在哪里?
是应该进入服务层还是将其放入控制器并让控制器直接调用存储库?控制器 - >对于jquery网格,存储库显示为here。
但与该文章不同,我的存储库返回IQueryable<datatype>
答案 0 :(得分:22)
如果您的存储库返回实体化序列(ICollection<T>
,List<T>
)等,它应该进入存储库。
但是如果你返回IQueryable<T>
(就像我一样),我希望你的控制器和存储库之间有一个服务层,它在IQueryable上执行查询并将它们具体化为具体的集合。
所以,我会把分页放在服务层。
这样的事情:
public PagedList<T> Find(Expression<Func<T,bool>> predicate, int pageNumber, pageSize)
{
return repository
.Find()
.Where(predicate)
.ToPagedList(pageNumber, pageSize);
}
.ToPagedList
可以是一种扩展方法,可将您需要的分页和项目应用于PagedList<T>
。
那里有很多PagedList<T>
个实现。我喜欢Rob Conery's one。具有View所需的属性,因此您可以绑定到PagedList<T>
并创建HTML帮助程序以非常轻松地呈现页码。任何分页列表LINQ实现的唯一问题是需要在服务器上执行Count()
操作(对于记录数),因此导致2次往返。
您不希望将非实体化查询返回到您的View,因为IMO会破坏MVC模式。
每次进入新页面时,请致电您的服务以检索所需的结果。
答案 1 :(得分:3)
答案 2 :(得分:2)
排序和分页是数据功能。它应该放在存储库中。
答案 3 :(得分:2)
存储库应该返回一个'PageableResultSet',或类似的东西,它负责分页。
答案 4 :(得分:0)
我相信分页应该放在存储库中。看到我在另一个问题上发布的这个答案。