OData“包含”vs Dynamics 365 Web API“包含”

时间:2018-04-20 06:04:33

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

通过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版本?

2 个答案:

答案 0 :(得分:3)

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

我们在网络API中没有Like operator equivalent functions

我的尝试&观察

Microsoft.Dynamics.CRM.Contains - 通用SQL错误。

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

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

答案 1 :(得分:2)

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

  

必须仅对启用了全文索引的属性使用Contains运算符。否则,您将在检索数据时收到通用SQL错误消息。在Microsoft Dynamics 365默认安装中,仅启用KBArticle(article)实体的属性以进行全文索引。

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