oData - 如何使用特定odata.type的过滤器

时间:2015-02-12 18:00:01

标签: odata

我的oData查询如下。

http://localhost:21005/api/v1/Devices?$扩大=工作

我的oData JSON响应(以Postman的漂亮格式)如下。

{
"@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" 例如,我只想要所有" Jobs"其数据类型为"#VT.Api.Models.GetDataJob" (" @ odata.type":" #VT.Api.Models.GetDataJob")。我应该使用什么样的过滤器或查询?

3 个答案:

答案 0 :(得分:1)

根据当前规范,正确的方法是将类型过滤器应用于扩展表达式,例如:

http://host/service/Orders?$expand=Customer/Model.VipCustomer

或者,使用您的示例,

http://localhost:21005/api/v1/Devices?$expand=Jobs/VT.Api.Models.GetDataJob

请注意,这将返回所有设备,展开其Jobs关联,并仅将GetDataJob个实例添加到生成的关联集中。如果您只想查询拥有 GetDataJob个实例的设备,则需要查看是否可以将lambdas与类型过滤器一起使用。

另请参阅this SO questionOData Version 4.0 Part 2: URL Conventions

答案 1 :(得分:0)

根据OData规范,您应该能够使用“IsOf”功能来完成此任务。但是,我不相信这已经在WebApi OData v4中实现(假设你正在使用它):

https://github.com/OData/WebApi/issues/185

答案 2 :(得分:0)

查询应该是: ?http://localhost:21005/api/v1/Devices $扩大=作业($滤波器= ISOF(' VT.Api.Models.GetDataJob'))

但正如Brad所说,IsOf尚未在webapi odata v4中实现。