Andrew Connell
Andrew Connell

Reputation: 5287

Filtering nested results an OData Query

I have a OData query returning a bunch of items. The results come back looking like this:

{
    "d": {
        "__metadata": {
            "id": "http://dev.sp.swampland.local/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)",
            "uri": "http://dev.sp.swampland.local/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)",
            "type": "SP.UserProfiles.PersonProperties"
        },
        "UserProfileProperties": {
            "results": [
                {
                    "__metadata": {
                        "type": "SP.KeyValue"
                    },
                    "Key": "UserProfile_GUID",
                    "Value": "66a0c6c2-cbec-4abb-9e25-cc9e924ad390",
                    "ValueType": "Edm.String"
                },
            {
                "__metadata": {
                    "type": "SP.KeyValue"
                },
                "Key": "ADGuid",
                "Value": "System.Byte[]",
                "ValueType": "Edm.String"
            },
            {
                "__metadata": {
                    "type": "SP.KeyValue"
                },
                "Key": "SID",
                "Value": "S-1-5-21-2355771569-1952171574-2825027748-500",
                "ValueType": "Edm.String"
            }

           ]
        }
    }
}

In reality, there's a lot of items (100+) coming back in the UserProfileProperties collection however I'm only looking for a few where the KEY matches a few items but I can't figure out exactly what I need my filter to be. I've tried $filter=UserProfileProperties/Key eq 'SID' but that still gives me everything. Also trying to figure out how to pull back multiple items.

Ideas?

Upvotes: 0

Views: 3152

Answers (1)

Henoch
Henoch

Reputation: 55

I believe you forgot about how each of the results have a key, not the UserProfileProperties so UserProfileProperties/Key doesn't actually exist. Instead because result is an array you must check either a certain position (eq. result(1)) or use the oData functions any or all.

Try $filter=UserProfileProperties/results/any(r: r/Key eq 'SID') if you want all the profiles where just one of the keys is SID or use

$filter=UserProfileProperties/results/all(r: r/Key eq 'SID') if you want the profiles where every result has a key equaling SID.

Upvotes: 2

Related Questions