我正在用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属性中调用时,我认为此顺序不相同。
答案 0 :(得分:2)
要获取查找实体,最好在$expand
上执行ManyToOneRelationships
而不是Attributes
并获得ReferencedEntity
值。
类似的事情应该起作用:
.../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)