建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里:https://www.cnblogs.com/cgzl/p/9047626.html 和 https://www.cnblogs.com/cgzl/p/9080960.html
本文需要的代码 (右键另存,把后缀改为zip):https://images2018.cnblogs.com/blog/986268/201806/986268-20180604151009219-514390264.jpg
本代码已经更新至ASP.NET Core 2.1. (从ASP.NET Core 2.0 迁移至 ASP.NET Core 2.1: https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1)
本文主要介绍一些常见情况的实现,包括:集合更新、翻页、排序、过滤等等。但是仍然是Richardson成熟度顶多为2级的Web API,未达到RESTful API的标准和约束。
集合的更新操作
看这种更新集合的情况,原来数据库里中国存了4个城市(北平,上海,盛京,海参崴);而几个世纪后北平改名叫北京了,盛京改名为沈阳了,海参崴不属于中国了就删除了,威海从县成为市就算是新增,而上海保持不变。现在就是要对中国的城市进行整体性的更新操作,里面会包含:添加、删除、更新操作。看代码:
集合更新,我一共分了三步进行的操作:
1. 把数据库中存在的但是传进来的数据里没有的城市删掉
2. 把数据库中没有的而传进来的数据里有的数据进行添加操作,其实这里只判断id为0即可
3. 把数据库中原有和传进来的参数里也存在的数据条目进行更新。
然后保存即可。
先看一下原有的数据:
然后我们执行集合的更新:
执行之后,再次查询:
集合按预期更新了。
我相信大家肯定会写这段代码,或者有更简单的实现方式(请贴出来)。但这不是重点,我看到有人这样写,把上面那三步代码写在了AutoMapper的配置文件里:
首先,需要忽略Country的Cities属性的映射操作,然后把那部分代码写在AfterMap里面即可,这样在Action方法里面就简单了,可以使用Automapper了:
这只是一种可选的写法而已,不一定就必须放在AutoMapper的配置文件里。
翻页
翻页可以避免一些性能问题,不必一次性加载所有数据。所以最好默认就采用分页,而且每页的条目数量必须有限制,不能太大。
分页信息应该使用查询字符串(query stringg)传递参数。格式应该这样:
:5000/api/country?pageIndex=12&pageSize=10
这里我喜欢使用pageIndex这个词,这也意味着页数是从0开始的;当然很多人喜欢用pageNumber等词,也就是说更喜欢页数从1开始,这个其实随意吧。
在ASP.NET Core里,我要使用Linq来动态组建一个查询的表达式(IQueryable<T>,可以创建表达式树),它是延迟执行的,直到各种条件都判断完了并组建出最终的查询表达式之后才去执行(查询数据库)。这个查询表达式只有在进行迭代的时候才会查询数据库。
触发迭代动作可以使用下面的方法:
foreach 循环
ToList(), ToArray(), ToDictionary() 以及相应的异步版本(ToXxxxAsync())
单项查询,例如 Average(), Count(), First(), FirstOrDefault(), SingleOrDefault()等等,以及相应的异步版本。
需要确保的是要在迭代发生之前,使用Skip()和Take()以及Where()。
下面我一点一点来写代码: