OData是什么
官方解释:The Open Data Protocol (OData) is a data access protocol for the web. OData provides a uniform way to query and manipulate data sets through CRUD operations (create, read, update, and delete).
开始使用OData
要想使用OData,还有以下工作要做。
a.安装OData的程序包。可以通过NuGet程序包管理器安装,安装命令:Install-Package Microsoft.AspNet.Odata
b.配置OData EndPoint。在WebApiConfig的Register方法中注册OData路由和创建EDM,代码如下图。
c.创建OData Controller和Action,代码如下图。
现在可以访问下面两个url看看效果。
http://localhost.dev.wingontravel.com/HWAODataSite/opi?$metadata
,查看元数据,如下图
http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$select=CityName,CityEnglishName ,查询CityName和CityEngLishName,多个字段用,号分隔,如下图。
查询
先来看一下OData支持哪些查询选项,汇总如下图,然后来分别说明和演示。
①$select,一般用来返回指定的字段,如url:http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$select=CityName,CityEnglishName
②$filter,一般用于过滤结果。如下面例子。
?http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$filter=CityCode eq ‘TSN’,过滤CityCode=“TSN”
?http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$filter=CityID lt 5,过滤CityID<5
?http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$filter=CityID ge 5,过滤CityID>5
?http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$filter=substringof(‘T’,CityCode),过滤CityCode包含”T”的,报错’ An unknown function with name ‘substringof‘ was found’,还不知道为什么。
重要:要使用filter功能,必须激活它。如下代码。
③$skip和$top,一般用于分页。
?$skip和$top基于客户端分页,比如url:http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$top=5&$skip=5
?[PageSize]属性,服务端分页,如下代码,限制接口一次只能返回10条记录。
④$orderby,排序。比如
?http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$orderby= CityID desc,按CityID降序排
?http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$orderby= CityCode,CityID desc,组合排序
重要:要使用orderby,需要激活。如下代码。
3.1 一个综合查询的例子
需求:查询CityID<16,取第二页(每页5条数据),按CityID降序排序,并且只返回CityName+CityEnglishName两个字段的城市信息。
Url:
http://localhost.dev.wingontravel.com/HWAODataSite/opi/Citys?$filter=CityID lt 16&$top=5&$skip=5&$orderby=CityID desc&$select=CityName,CityEnglishName
注意:这个url放在fiddler中需要encode
OData V4特性路由
OData v4的特性路由类似于WebApi 2的特性路由,可以向Controller添加ODataRoutePrefix和向Action添加ODataRoute特性,它们都是在命名空间System.Web.OData.Routing下,而WebApi 2的特性路由在命名空间System.Web.Http下。如下代码。
附:以上Demo已经放到GitHub上了。
1.https://github.com/mcgrady525/HelloWebAPI ,路由,序列化和模型绑定
2.https://github.com/mcgrady525/HelloWebAPI.OData ,OData和重点关注的部分