武装你的WEBAPI-OData便捷查询 (2)

查看文档之后,原来是我数据的层级比较深了,不在顶级层级类型的查询,在EF Core3.0的版本之前是支持的,在3.0以后就不支持了,主要是怕服务器内存溢出。如果真的要支持,那么就使用AsEnumerable()去实现客户端查询。

datetime相关

有同学已经注意到了,我这边使用的timestamp的格式是unix形式的时间戳,而没有使用到js常用的ISO8601格式(2004-05-03T17:30:08+08:00)。如果需要使用到这种时间怎么办?

OData提供了一个语法,使用(datetime'2016-10-01T00:00:00')这种形式来表示Datetime,这样就能够实现基于datetime的查询。

查询顺序

谓词会使用以下的顺序:$filter, $inlinecount(在V4中已经替换为$count), $orderby, $skiptoken, $skip, $top, $expand, $select, $format。
filter总时最优先的,随后就是count,因此查询返回的count总是符合要求的所有数据的计数。

范例学习

官方有一个查询的Service,可以参考学习和试用,给了很多POSTMAN的示例。

不过有一些略坑的是,有的内容比如Paging里面,加入$count的返回是错的。

前端指南

查询的方法这么复杂,如果手动去拼接query string还是有点虚的,好在有很多库可以帮助我们做这个。

官方提供了各种语言的Client和Server的库:https://www.odata.org/libraries/

前端比较常用的有o.js

const response = await o('http://my.url') .get('User') .query({$filter: `UserName eq 'foobar'`}); console.log(response); // If one -> the exact user, otherwise an array of users

这样可以免去拼请求字符串的烦恼,关于o.js的详细介绍,可以看。

参考资料

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-odata/965a7cb1-663e-4eef-b9f6-388c7e5c9444?redirectedfrom=MSDN

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpppzz.html