首先我们需要从参数(query string参数)传进来pageIndex和pageSize,还要赋默认值,以防止API的消费者没有设置pageIndex和pageSize;由于pageSize的值是由API的消费者来定的,所以应该在后端设定一个最大值,以免API的消费者设定一个很大的值。
由于所有的资源几乎都要使用翻页,所以我们最好使用一个公共类来封装这些翻页相关的信息:
(我暂时把这个类放在了Core项目里)。
这个公共类很简单,可以为pageIndex和pageSize设定默认值,也设置了一个每页的最多条目数是100;这里面还有一个OrderBy属性,默认值是“Id”,因为翻页必须要先排序,但目前这个OrderBy属性还没用上。
而针对具体的资源,我们可以再建立一个类继承于PaginationBase,这个类就是Country的参数类:
由于暂时还没有什么特别的参数,所以里面是空的。
下面我修改一下CountryRepository:
可以看到我组建了这个查询的表达式,并且直接出发了迭代动作,返回查询结果。
回到Action方法里:
我使用了这个参数类代替了之前的pageIndex和pageSize参数,因为ASP.NET Core足够智能,可以把这两个参数解析到这个类里面。
下面测试一下:
我就不进行多次测试了,这个是好用的。
如果你是用的是关系型数据库的话,应该可以在Log的输出媒介上看到打印出的SQL语句(但我这里使用的是内存数据库,所以看不到),如果使用关系型数据库还是看不到SQL语句的话,请配置一下:
返回翻页的元数据很显然只返回当前页的数据是不满足需求的,至少还需要返回总页数,总数等信息,还有可能需要返回前一页或者后一页的链接。但是如何把这些信息连同当页的数据一起返回给API消费者呢?
下面的做法是可以把这些数据都返回去的:
{ “data”: [{country1}, {country2}...], “metadata”: {"prev": "/api/...", ....} }