Asp.net mvc 在存储库模式中,分页、排序等在哪里?

Asp.net mvc 在存储库模式中,分页、排序等在哪里?,asp.net-mvc,asp.net-mvc-3,repository-pattern,Asp.net Mvc,Asp.net Mvc 3,Repository Pattern,在asp.net存储库模式项目中,我们将分页和排序数据的逻辑放在哪里 它应该进入服务层还是放在控制器中,让控制器直接调用存储库?显示jquery网格的控制器->存储库 但与那篇文章不同的是,我的存储库返回的IQueryable排序和分页是数据函数。它应该放在存储库中。 排序:对于大型结果集,应在存储库中进行排序;可在控制器内完成小集合(即无分页) 分页:在IMO中,存储库应该公开一种返回集合切片的方法(这与分页不完全相同)。也就是说,应该有一种方法要求存储库返回一个查询,从索引z开始,然后返回下

在asp.net存储库模式项目中,我们将分页和排序数据的逻辑放在哪里

它应该进入服务层还是放在控制器中,让控制器直接调用存储库?显示jquery网格的控制器->存储库


但与那篇文章不同的是,我的存储库返回的
IQueryable
排序和分页是数据函数。它应该放在存储库中。

  • 排序:对于大型结果集,应在存储库中进行排序;可在控制器内完成小集合(即无分页)
  • 分页:在IMO中,存储库应该公开一种返回集合切片的方法(这与分页不完全相同)。也就是说,应该有一种方法要求存储库返回一个查询,从索引z开始,然后返回下一个y项。然后,与特定页面大小(或页面索引)相关的所有内容都应保存在控制器中。这样,您可以优化数据检索,但无需将模型与特定的表示需求耦合

存储库应返回负责分页的“PageableResultSet”或类似的内容

我认为分页应该放在存储库中。请看我在另一个问题上发布的答案


如果存储库返回物化序列(
ICollection
List
)等,则应将其放入存储库中

但是如果您返回的是
IQueryable
(像我一样),我希望您在控制器和存储库之间有一个服务层中介,它执行IQueryable上的查询并将它们具体化为具体的集合

因此,我将把分页放在服务层

大概是这样的:

public PagedList<T> Find(Expression<Func<T,bool>> predicate, int pageNumber, pageSize)
{
   return repository
             .Find()
             .Where(predicate)
             .ToPagedList(pageNumber, pageSize);
}
publicpagedlistfind(表达式谓词、int pageNumber、pageSize)
{
返回存储库
.Find()
.Where(谓词)
.ToPagedList(页码、页面大小);
}
.ToPagedList
可以是一种扩展方法,用于将所需的分页和项目应用于
分页列表

有许多
PagedList
实现。我喜欢。具有视图所需的属性,因此您可以绑定到
页面列表
,并创建一个HTML帮助程序,以非常轻松地呈现页码。任何分页列表LINQ实现的唯一问题是需要在服务器上执行
Count()
操作(记录数),因此会导致两次往返

您不希望将非物化查询返回到视图,因为这打破了MVC模式


每次转到新页面时,都要调用服务来检索所需的结果。

所以我的存储库方法需要接受所有这些参数?我可以这么说。提供正确的数据子集所需的任何参数。实际上,这可以归结为您对体系结构的理念,以及您希望向它展示多少联邦性。Linq.Skip()和.Take()还不够吗?您可以编写一个扩展方法GetPage(intindex[,intpagesize=20])来完成它。