Search code examples
javascriptodatabreeze

Is there any way to form the Odata filter like $filter=Emails/any(s: s eq 'somestring') using Breeze library?


For example I have a model structure like the following:

{
"@odata.context": "serviceRoot/$metadata#People",
"@odata.nextLink": "serviceRoot/People?%24skiptoken=8",
"value": [
    {
        "@odata.id": "serviceRoot/People('russellwhyte')",
        "Emails": [ "[email protected]", "[email protected]" ]
    }, 
    ...
    ]
}

And I want to query all People who have "[email protected]" email in theirs email list. (Notice that the Emails is a collection of primitive type string.)

It seems like Breeze can only do smth like this, when dealing with collection of complex objects:

var query = EntityQuery.from("People")
.where("Email", "any", "fldname",  "eq", "[email protected]");  

Here "fldname" is a field that supposed to be inside the Email type.

But what if I want to compare primitive type like String and I don't have any field inside? In this case OData query would looks like the following:

$filter=Emails/any(s: s eq '[email protected]')

But is there any way to form this query using Breeze?


Solution

  • Yes and no.

    No, you can't compose it with the breeze query language which, AFAIK, doesn't understand filtering on a property that returns an array of strings.

    But YES, you can send any URL to the server with a breeze query. If you can manually construct a URL that your OData server will interpret appropriately, go right ahead and send it.

    var qUrl = "People/?$filter=Emails/any(s: s eq '[email protected]')";
    var q = breeze.EntityQuery.from(qUrl);
    manager.executeQuery(q).then(...).catch(...);