我有一些fetchXml,我正在通过Dynamics CRM Web API执行。 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发送此查询时,我得到了响应以及&#34; new_lookupForSomeEntityA&#34;的值。包括值(GUID)和格式化值(它的名称)。但是&#34; new_lookupForSomeEntityB&#34;的响应仅包含GUID,我无法找到获得它的GUID和价值的方法。我添加了一个标题记录:
"Prefer": "odata.include-annotations=OData.Community.Display.V1.FormattedValue"
但似乎只是为我提供了主要实体的格式化值,而不是链接实体。这是Web API的限制还是我做错了什么?任何帮助将不胜感激。
答案 0 :(得分: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
}]
}
它适用于内部和外部链接类型。
Link-Entity属性别名与属性的名称相同 如果使链接实体属性的别名与属性名称相同,则根本不返回该属性。此问题似乎适用于所有链接实体属性。
<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>
省略link-entity属性别名
如果省略了链接实体属性的别名,则会返回一个可怕的名称:
<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版中得到解决。