2

我有一些通过 Dynamics CRM Web API 执行的 fetchXml。fetchXml 查询的构造如下:

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="new_someEntityA">
    <attribute name="new_lookupForSomeEntityA" />
  <link-entity alias="new_someEntityB" name="new_someEntityB" from="entityBId" to="entityAId" visible="false" link-type="outer">
    <attribute name="new_lookupForSomeEntityB" />
  </link-entity>
  </entity>
</fetch>

当我通过 Web API 发送此查询时,我收到响应,并且“new_lookupForSomeEntityA”的值包括值 (GUID) 和格式化值(它的名称)。但是“new_lookupForSomeEntityB”的响应只包括 GUID,我找不到获取它的 GUID 和值的方法。我添加了一个标题记录:

"Prefer": "odata.include-annotations=OData.Community.Display.V1.FormattedValue"

但这似乎只是让我获得了主要实体而不是链接实体的格式化值。这是 Web API 的限制还是我做错了什么?任何帮助,将不胜感激。

4

1 回答 1

2

下面是一些代码,它们使用 Web API + FetchXml 返回链接实体选项集的格式化值。
针对 API 8.2 版进行了测试:

var oDataUrl = 'https://[your_org].crm4.dynamics.com/api/data/v8.2/';
var encodedFetchXml = encodeURI(`
<fetch top="10" no-lock="true" >
  <entity name="contact" >
    <attribute name="fullname" alias="contactName" />
    <link-entity name="incident" from="customerid" to="contactid" link-type="inner" alias="incident" >
      <attribute name="caseorigincode" alias="incidentOrigin" />
    </link-entity>
  </entity>
</fetch>
`);
$.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    datatype: "json",
    url: `${oDataUrl}contacts?fetchXml=${encodedFetchXml}`,
    beforeSend: function (XMLHttpRequest) {
        XMLHttpRequest.setRequestHeader("Accept", "application/json");
        XMLHttpRequest.setRequestHeader("Prefer", "odata.include-annotations=OData.Community.Display.V1.FormattedValue");
    }
}).then(function (response) {
    // formatted value included in the response objects
    // incidentOrigin@OData.Community.Display.V1.FormattedValue:"WhatsApp"
    console.dir(response); 
}); 

这是返回的数据:
{ "@odata.context":"https://[your_org].crm4.dynamics.com/api/data/v8.2/$metadata#contacts(contactid)", "value":[{ "@odata.etag": "W/\"873006\"", "contactid": "ecfd1feb-d826-468a-bfe3-6ebd781c39f4", "contactName": "Ada Lovelace", "incidentOrigin@OData.Community.Display.V1.FormattedValue": "WhatsApp", "incidentOrigin": 269420000 }] }

它适用于内部和外部链接类型。

链接实体属性别名与属性名称相同
如果使链接实体属性的别名与属性名称相同,则根本不会返回该属性。此问题似乎适用于所有链接实体属性。

<fetch top="500" no-lock="true" >
<entity name="contact" >
    <attribute name="fullname" alias="contactName" />
    <link-entity name="incident" from="customerid" to="contactid" link-type="inner" alias="incident" >
    <attribute name="caseorigincode" alias="caseorigincode" />
    </link-entity>
</entity>
</fetch>

省略链接实体属性别名
如果省略链接实体属性的别名,则返回一个可怕的名称:

<fetch top="500" no-lock="true" >
<entity name="contact" >
    <attribute name="fullname" alias="contactName" />
    <link-entity name="incident" from="customerid" to="contactid" link-type="inner" alias="incident" >
    <attribute name="caseorigincode" />
    </link-entity>
</entity>
</fetch>

返回的对象具有如下字段:
incident_x002e_caseorigincode@OData.Community.Display.V1.FormattedValue:"WhatsApp"

也许您遇到的问题已在 8.2 版中得到解决。

于 2017-01-24T20:17:01.903 回答