【问题标题】:OData "contains" vs Dynamics 365 Web API "contains"OData“包含”与 Dynamics 365 Web API“包含”
【发布时间】:2018-04-20 06:04:32
【问题描述】:

通过 Web API 查询 Dynamics 365 时,有多个运算符可供选择以过滤查询的数据。其中一个运算符是contains,它实际上出现了两次。

一个是 OData contains 函数(您可以在标题“标准查询函数”下找到它):

https://msdn.microsoft.com/en-us/library/gg334767.aspx#Filter%20results

例子:

$filter=contains(name,'(sample)')

另一个是 Dynamics 365 Web API 本身的实现:

https://msdn.microsoft.com/en-us/library/mt608053.aspx

我试过这个,但只得到一个通用 SQL 错误:

$filter=Microsoft.Dynamics.CRM.Contains(PropertyName='name',PropertyValue='(sample)')

有什么区别?也许有人甚至可以告诉我如何正确调用contains 的Web API 版本?

【问题讨论】:

    标签: dynamics-crm odata dynamics-365 dynamics-crm-365 dynamics-crm-webapi


    【解决方案1】:

    Latest documentation 确认 $filter=contains(name,'(sample)') 是唯一适用于 web api 的语法。正如 Jatin 所说,OData 过滤器在后台转换为查询表达式,一些文章 (this & this) 传达了可能的解决方案是直接在 C# 查询表达式中使用 Like 运算符。

    我们在 web api 中没有 Like operator equivalent functions

    我的尝试和观察

    Microsoft.Dynamics.CRM.Contains - 一般 SQL 错误。

    $filter=like(name,'%test%') - 发现了一个名为“like”的未知函数。这也可能是函数导入或导航属性上的键查找,这是不允许的。

    $filter=contains(name, 'test') - 工作

    【讨论】:

    • 您是否像其他答案一样在 KbArticles 上执行此操作,或者为任何实体执行此操作?
    • @jasonscript 任何实体,包括 kbarticle
    【解决方案2】:

    我认为这两种方法是等效的。添加了 Web API 过滤功能以支持标准的 OData 过滤功能。 Contains 函数是将 CRM 中支持的所有条件运算符公开为 OData 函数的结果。请在 D365 文档中搜索 ConditionOperator 枚举以获取有关 Contains 运算符的信息。它提到了 SQL 错误背后的原因。 Copying the same below:

    您必须仅对那些启用全文索引的属性使用包含运算符。否则,您将在检索数据时收到一般 SQL 错误消息。在 Microsoft Dynamics 365 默认安装中,仅 KBArticle(文章)实体的属性启用全文索引。

    最好使用 Web API 过滤功能,因为它更符合习惯。使用它会遇到什么错误?我想两者的根本原因可能是相同的,因为 OData 过滤器查询在后端转换为 D365 查询表达式,并且包含过滤器应该被转换为包含条件运算符。

    【讨论】:

    • 我在CRM在线测试过,连kbarticle都出现Generic SQL错误。 /api/data/v8.2/kbarticles?$filter=Microsoft.Dynamics.CRM.Contains(PropertyName='title',PropertyValue='test')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2015-12-08
    • 1970-01-01
    • 2014-10-12
    • 2018-07-09
    相关资源
    最近更新 更多