Vik
Vik

Reputation: 1

oData - how to use filter for specific odata.type

My oData query is as follow.

http://localhost:21005/api/v1/Devices?$expand=Jobs

My oData JSON response (in Postman's Pretty format) is as follow.

{
"@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": [ ]
    }
}

Now, I want to query for only specific "@oData.type" For example, I just want all the "Jobs" whose data type is "#VT.Api.Models.GetDataJob" ("@odata.type": "#VT.Api.Models.GetDataJob"). What kind of filter or query should I use?

Upvotes: 0

Views: 5997

Answers (3)

Michael Jess
Michael Jess

Reputation: 1907

According to the current spec, the correct way would be to apply a type filter to the expand expression, e.g.:

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

or, using your example,

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

Please note that this will return all devices, expand their Jobs association, and only add GetDataJob instances to the resulting association sets. If you only want to query devices that have GetDataJob instances, you will need to see if you can use lambdas with type filters.

See also this SO question and OData Version 4.0 Part 2: URL Conventions

Upvotes: 1

Karata
Karata

Reputation: 1149

The query should be: http://localhost:21005/api/v1/Devices?$expand=Jobs($filter=isof('VT.Api.Models.GetDataJob'))

but as Brad said, IsOf has not been implemented in webapi odata v4.

Upvotes: 3

Brad
Brad

Reputation: 4192

According to the OData spec you should be able to use the "IsOf" function to accomplish this. However, I don't believe this has been implemented yet in WebApi OData v4 (assuming that's what you're using):

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

Upvotes: 0

Related Questions