在展开查询中进行选择之前进行OData过滤

时间:2019-01-16 13:25:15

标签: rest dynamics-crm odata query-string odata-v4

我正在用Dynamics 365编写元数据查询,但是我认为这个问题对于任何OData查询都可能是普遍的。

我的问题如下:

在Dynamics中,我们可以在实体中具有多种类型的字段,例如字符串,布尔或查找。我想编写一个查询,返回查询要处理的实体的类型。

{url}/api/data/v9.0/EntityDefinitions(LogicalName='Account')
?$select=
    LogicalName
&$expand=
    Attributes(
        $select=
            LogicalName,
            AttributeType,
            Targets; -- Problematic property
        $filter=
      AttributeType+eq+Microsoft.Dynamics.CRM.AttributeTypeCode'Lookup')

如果我在此查询中不包括“目标”的选择,则会得到正确的结果,因为所有属性的yr AttributeType为Lookup。

但是当我要求同时包含Target时,会出现错误消息

Could not find a property named 'Targets' on type 'Microsoft.Dynamics.CRM.AttributeMetadata

由于Target属性仅存在于Lookup类型的那些arrrribute上,因此从字符串属性中选择此列将失败并抛出此错误。

有没有一种方法可以在选择列之前先过滤查找内容?我发现here的评估顺序为

$ filter,$ inlinecount,$ orderby,$ skiptoken,$ skip,$ top,$ expand,$ select,$ format

这正是我所需要的,除了在$ expand属性中调用时,我认为此顺序不相同。

2 个答案:

答案 0 :(得分:2)

要获取查找实体,最好在$expand上执行ManyToOneRelationships而不是Attributes并获得ReferencedEntity值。

ManyToOne

类似的事情应该起作用:
.../api/data/v9.1/EntityDefinitions(LogicalName='account') ?$select=LogicalName &$expand=ManyToOneRelationships($select=ReferencingAttribute,ReferencedEntity)

结果子集:

  

{“ @ odata.context”:“ https://myOrg.api.crm.dynamics.com/api/data/v9.1/ $ metadata#EntityDefinitions(LogicalName,ManyToOneRelationships(ReferencingAttribute,ReferencedEntity))/ $ entity”,“ LogicalName”:“帐户”,“ MetadataId”:“ 70816501 -edb9-4740-a16c-6a5efbc05d84“,” ManyToOneRelationships“:[{” ReferencingAttribute“:” msdyn_accountkpiid“,” ReferencedEntity“:” msdyn_accountkpiitem“,” MetadataId“:” 2a712c96-09b1-d811“ 33,db {d “ ReferencingAttribute”:“ preferredequipmentid”,“ ReferencedEntity”:“设备”,“ MetadataId”:“ b4b462b5-ee78-467d-a97a-45264d234816”},{“ ReferencingAttribute”:“ primarycontactid”,“ ReferencedEntity”:“ contact”, “ MetadataId”:“ 410707b1-9554-4cd9-8437-6608b1802904”},{“ ReferencingAttribute”:“ masterid”,“ ReferencedEntity”:“ account”,“ MetadataId”:“ 51fa4af7-93d0-4f06-8949-38a0036ddc64”} ,{“ ReferencingAttribute”:“ preferredsystemuserid”,“ ReferencedEntity”:“ systemuser”,“ MetadataId”:“ a6b48e23-fada-4b7f-8655-530bba050765”},{“ ReferencingAttribute”:“ createdbyexternalparty”,“ ReferencedEntity”:“ externalparty “,” MetadataId“:” 9967fe7d-84ee-4 a26-9ad7-a8fdbdfa2316“},{” ReferencingAttribute“:” modifiedby“,” ReferencedEntity“:” systemuser“,” MetadataId“:” 8be02a9d-0776-4c76-b35f-1c92dd791d9e“},{” ReferencingAttribute“:” parentaccountid“ ,“ ReferencedEntity”:“帐户”,“ MetadataId”:“ 57511732-b553-4cfb-bcf2-d280f9f8c6f1”},{“ ReferencingAttribute”:“ entityimageid”,“ ReferencedEntity”:“ imagedescriptor”,“ MetadataId”:“ 5b4942d5- 1fcd-49ca-91c0-2737f5f104f3“},

此外,作为参考,我尝试对属性和目标进行$expand
../api/data/v9.1/EntityDefinitions(LogicalName='account')?$select=LogicalName&$expand=Attributes($filter=AttributeType+eq+Microsoft.Dynamics.CRM.AttributeTypeCode%27Lookup%27&$expand=Targets)

它引发错误:

  

“查询选项'$ expand'被多次指定,但是必须   最多指定一次。”

答案 1 :(得分:0)

如果用逗号分隔属性和ManyToOneRelationships,则可以在同一调用中对其进行扩展。

GET https://{{baseUrl}}/api/data/v9.1/EntityDefinitions(LogicalName='account')?$select=LogicalName,EntitySetName&$expand=Attributes($select=LogicalName),ManyToOneRelationships($select=ReferencingAttribute,ReferencedEntity)