web-dev-qa-db-ja.com

互換性のない型の二項演算子が検出されました。演算子の種類「等しい」のオペランドタイプ「Edm.Guid」および「Edm.String」が見つかりました

Kendo ListViewからODataを呼び出すと、次の例外が発生します。

「互換性のないタイプのバイナリ演算子が検出されました。演算子の種類 'Equal'のオペランドタイプ 'Edm.Guid'および 'Edm.String'が見つかりました

デコードされたフィルター:
$ filter = OrganizationId eq '4c2c1c1e-1838-42ca-b730-399816de85f8'

エンコードされたフィルター:
%24filter = OrganizationId + eq +%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 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'
});
11
Prisoner ZERO

ODataサービスがプロトコルバージョンV4の場合、正しいクエリURLは次のようになります。

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

一重引用符は必要ありません。

20
Yi Ding - MSFT

MicrosoftDynamicsを介してOData4.0をクエリすると、このエラーが発生しました。ここでの他の答えは、正確に正しいとしても、残念ながら役に立ちませんでした。私の問題は、フィルターでEntityReferenceを渡すことでした。

外部キーを適切にターゲットにするために、フィルターをこのようなものに調整する必要がありました。以下の例では、「parentaccountid」は、私が問い合わせていたエンティティの外部キーです。 'accountid'は、accountsエンティティの主キーです。

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

Ms crmで別のエンティティ参照へのIDの種類を持つすべての値は、このように評価する必要があります。

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

引用符やguid文字列は必要ありません。

1
RohitKumar