检测到具有不兼容类型的二元运算符。找到操作数类型'Edm.Guid'和'Edm.String'用于运算符类'Equal'

时间:2015-03-11 19:35:09

标签: javascript c# kendo-ui odata

从Kendo ListView调用OData时出现以下异常:

  

"检测到具有不兼容类型的二元运算符。找到了操作数   类型' Edm.Guid'和' Edm.String'对于运营商类型' Equal'"

解码过滤器:
$ filter = OrganizationId eq' 4c2c1c1e-1838-42ca-b730-399816de85f8'

编码过滤器:
%24filter = OrganizationId +当量+%274c2c1c1e-1838-42ca-b730-399816de85f8%27

这些过滤器也非常糟糕:
$ filter = OrganizationId eq guid' 4c2c1c1e-1838-42ca-b730-399816de85f8'
$ filter = OrganizationId eq cast(' 4c2c1c1e-1838-42ca-b730-399816de85f8',Edm.Guid)

MY WEB API CALL看起来像:

// 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看起来像:

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 个答案:

答案 0 :(得分:16)

如果OData服务是协议版本V4,则正确的查询URL应为:

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

不需要单引号。

答案 1 :(得分:2)

我遇到了通过Microsoft Dynamics查询OData 4.0的错误。不幸的是,这里的其他答案没有帮助,即使它们是正确的。我的问题更多是在过滤器中使用EntityReference。

我最终不得不将我的过滤器调整为类似的形式,以正确地定位外键。在下面的示例中,“ parentaccountid”是我正在查询的实体中的外键。 “ accountid”是帐户实体中的主键。

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

答案 2 :(得分:1)

每个以ms crm为另一个实体引用的id的值都应该像这样评估。

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

不需要引号或guid字符串。

答案 3 :(得分:-2)

请尝试

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