如何将 UI 上的 MS Dynamics CRM ID 转换为 API 理解的 ID (GUID)

How to transform MS Dynamics CRM ID on UI to the ID that API understands (GUID)

如何将 MS Dynamics CRM ID "on UI" 转换为 API 理解的 ID (GUID)?或者 - 如何通过 API 使用 CRM UI ID 获取给定的 CRM 实体?

UI 上的 ID 示例:

API理解的ID示例(GUID):

53d9f073-9418-4d59-9c7f-2f2b43e86051

所以我认为正在进行一些转换,尽管我不知道是哪一个?我也知道有 "sequential GUIDs"(以提高性能)但这对这个 "transformation" 问题没有多大帮助。

当然还有其他选择,即 CRM UI 隐藏了真实的实体 ID,但这仍然很奇怪,因为我在 API实体...

所以,我想通过 CRM UI ID 通过 CRM API 获取实体。我该怎么做?

Dynamics CRM 中的每个实体记录都分配有一个 Guid。保存 guid 的字段(又名属性)是 EntityLogicalNameid。例如,帐户是 accountid,名为 new_customentity 的自定义实体将有一个名为 new_customentityid.

的字段

在新记录的创建过程中,Dynamics CRM 将为该记录生成一个顺序 ID。注意:您可以为通过 SDK 进行的调用指定 ID,但不建议这样做,因为这会中断序列。

这个值不直接显示在UI上。可以通过调用 Xrm.Page.data.entity.getId().

通过 JavaScript 检索它

因此知道如果我们想要获取记录的 ID,您可以将以下代码片段保存到 Dynamics CRM 中的 JavaScript WebResource 文件并将事件 DisplayEntityId 注册为 OnLoad 函数。当实体打开时,它将显示一个带有实体记录唯一 ID 的警告框。这当然只是为了概念验证,因为它会引起严重的可用性问题。

function DisplayEntityId() {
     alert(Xrm.Page.data.entity.getId());
}

还有另一种方法可以使用JavaScript through the browser URL。在 Dynamics CRM 中打开所需的记录(它必须是实际记录 - 而不是视图、仪表板等)并将以下内容粘贴到浏览器 URL。按 Enter 键,实体记录的唯一 ID 将可供复制。

javascript:var guid=frames[0].Xrm.Page.data.entity.getId();var str1=guid.replace(/{/g,""); var copy=str1.replace(/}/g,"");(function( {window.prompt("Copy to clipboard: Ctrl+C, Enter", copy);})();

请务必向右滚动以获取整个代码段。

尼克写的是对的。此外,假设您的自定义 Account ID 是唯一的,您可以使用 RetrieveMultiple(也是 QueryByAttribute)查询 CRM,并检查是否只有一条记录返回

string accountValue = "FMA-36056-YGPGY";
ConditionExpression condition = new ConditionExpression("new_accountid", ConditionOperator.Equal, accountValue);
FilterExpression filter = new FilterExpression(LogicalOperator.And);
filter.Conditions.Add(condition);
QueryExpression query = new QueryExpression
{
    EntityName = "account",
    ColumnSet = new ColumnSet(true),
    Criteria = filter
};

EntityCollection accounts = service.RetrieveMultiple(query);
if (accounts.Entities.Count == 0) { /* no records found */ }
if (accounts.Entities.Count == 1) { /* 1 record found */ }
if (accounts.Entities.Count > 1) { /* multiple records found */ }