18
votes

I am getting the following exception when calling OData from my Kendo ListView:

"A binary operator with incompatible types was detected. Found operand types 'Edm.Guid' and 'Edm.String' for operator kind 'Equal'"

DECODED FILTER:
$filter=OrganizationId eq '4c2c1c1e-1838-42ca-b730-399816de85f8'

ENCODED FILTER:
%24filter=OrganizationId+eq+%274c2c1c1e-1838-42ca-b730-399816de85f8%27

HAVE ALSO UNSUCESSFULLY TRIED THESE FILTERS:
$filter=OrganizationId eq guid'4c2c1c1e-1838-42ca-b730-399816de85f8'
$filter=OrganizationId eq cast('4c2c1c1e-1838-42ca-b730-399816de85f8', Edm.Guid)

MY WEB API CALL LOOKS LIKE:

// GET: odata/Sites
[HttpGet]
[EnableQuery]
public IHttpActionResult GetSites(ODataQueryOptions<Site> queryOptions)
{
    IQueryable<Site> sites = null;

    try
    {
        queryOptions.Validate(_validationSettings);
        sites = _siteService.GetAll().OrderBy(x => x.SiteName);

        if (sites == null)
            return NotFound();
    }
    catch (ODataException ex)
    {
        TraceHandler.TraceError(ex);
        return BadRequest(ex.Message);
    }

    return Ok(sites);
}

MY JAVASCRIPT KENDO DATASOURCE LOOKS LIKE:

var dataSource = new kendo.data.DataSource({

    filter: { field: "OrganizationId", operator: "eq", value: that.settings.current.customer.id },
    schema: {
        data: function (data) {
            return data.value;
        },
        total: function (data) {
            return data.length;
        }
    },
    serverFiltering: true,
    serverPaging: true,
    transport: {
        parameterMap: function (options, type) {

            var paramMap = kendo.data.transports.odata.parameterMap(options);

            // Remove invalid Parameters that Web API doesn't support
            delete paramMap.$inlinecount; // <-- remove inlinecount
            delete paramMap.$format; // <-- remove format
            delete paramMap.$callback; // <-- remove callback

            // PLEASE NOTICE: That I have tried reformatting unsuccessfully
            //paramMap.$filter = paramMap.$filter.replace("OrganizationId eq ", "OrganizationId eq guid");
            //paramMap.$filter = "OrganizationId eq cast('81de6144-987c-4b6f-a9bd-355cb6597fc1', Edm.Guid)";

            return paramMap;
        },
        read: {
            url: buildRoute('odata/Sites')
            , dataType: 'json'
        }
    },
    type: 'odata'
});
4
I've seen multiple resources stating that using the guid'[VALUE]' syntax is correct, could you double check that? - Sven Grosen
I saw those and tried it in this attempt (noted above): $filter=OrganizationId eq guid'4c2c1c1e-1838-42ca-b730-399816de85f8' Do you think this is (somehow) formatted incorrectly? I am stuck. - Prisoner ZERO
Can you call it successfully via fiddler or directly in the browser instead of via Kendo? - Sven Grosen
Nope...directly entering the URL is how I was able to view the message (above) - Prisoner ZERO
What version of OData are you using? The guid'...' syntax was only required for older versions of OData, when we standardized we simplified this to be just '...' as in your "DECODED FILTER". Can you post a repro project somewhere? - Mark Stafford - MSFT

4 Answers

34
votes

If the OData service is of protocol version V4, the correct query URL should be:

$filter=OrganizationId eq 4c2c1c1e-1838-42ca-b730-399816de85f8

No single quotes is required.

2
votes

I ran into this error querying OData 4.0 through Microsoft Dynamics. The other answers here didn't help unfortunately, even though they are exactly right. My issue was more with handing EntityReference's in filters.

I ended up having to adjust my filter to something like this, to target the foreign key properly. In the example below 'parentaccountid' is the foreign key in the entity I was querying. 'accountid' is the primary key in the accounts entity.

/opportunities?$select=opportunityid&$filter=parentaccountid/accountid eq 5e669180-be01-e711-8118-e0071b6af2a1
1
votes

Every value which is having kind of an id to another entity reference in ms crm, should be evaluated like this.

 $filter=_foodValue eq 593687F4-8B0C-E811-81B1-91CF10505DB5 

Does not require quotes or guid string.

0
votes

Please try

$filter=OrganizationId%20eq%20guid%27067e6162-3b6f-4ae2-a171-2470b63dff02%27