我的oData查询如下
http://localhost:21005/api/v1/Devices?$expand=工作
我的oData JSON响应(Postman的Pretty格式)如下
{
"@odata.context": "http://localhost:21005/api/v1/$metadata#Devices",
_"value": [
{
"Id": "abc03c74-8697-49ec-85e6-6444112d0336",
"TimeOffset": 0,
"TimeOffsetMode": "Unmanaged",
"Jobs": [
{
"@odata.type": "#VT.Api.Models.GetDataJob",
"Id": "ba07d50a-f17d-4c65-b3cf-f3e03d1ba1cf"
},
{
"@odata.type": "#VT.Api.Models.GetDataProfilerJob",
"Id": "5aa9c046-e4f2-44de-b932-16c06b86b084"
},
{
"@odata.type": "#VT.Api.Models.GetDeviceConfigurationJob",
"Id": "d7dc0ac5-1f89-4356-aaa8-9ac40353e1af"
}
}
{
"Id": "d42ac1f0-1261-4100-8391-013a226ff25f",
"TimeOffset": 0,
"TimeOffsetMode": "Unmanaged",
"Jobs": [ ]
}
}
现在,我只想查询特定的"@oData.type"例如,我只想要所有数据类型为"#VT.Api.Models.GetDataJob"("@odata.type":"#VT.Api.Models.cetDataJob")的"作业"。我应该使用什么样的过滤器或查询?
查询应该是:http://localhost:21005/api/v1/Devices?$expand=作业($filter=isof("VT.Api.Models.GetDataJob")
但正如Brad所说,IsOf还没有在webapi odata v4中实现。
根据当前规范,正确的方法是对展开表达式应用类型过滤器,例如:
http://host/service/Orders?$expand=Customer/Model.VipCustomer
或者,以为例
http://localhost:21005/api/v1/Devices?$expand=Jobs/VT.Api.Models.GetDataJob
请注意,这将返回所有设备,扩展其Jobs
关联,并仅将GetDataJob
实例添加到生成的关联集。如果您只想查询具有GetDataJob
实例的设备,则需要查看是否可以将lambdas与类型筛选器一起使用。
另请参阅此SO问题和OData 4.0版第2部分:URL约定
根据OData规范,您应该能够使用"IsOf"函数来实现这一点。然而,我认为这还没有在WebApi OData v4中实现(假设这就是你正在使用的):
https://github.com/OData/WebApi/issues/185