如何利用Dynamics 365的retrieveRecord函数获取Lookup字段名称值?
解决Dynamics 365中Lookup字段名称获取与赋值问题
核心问题说明
你当前的代码仅获取了Lookup字段的ID(_kk_paymentterms_value这类字段存储的是关联记录ID),但Dynamics 365中设置Lookup字段需要完整的实体引用对象,包含三个属性:id(关联记录ID)、name(关联记录名称)、entityType(关联实体的逻辑名称)。同时注意:Xrm.WebApi.retrieveRecord是异步方法,不能直接同步赋值,必须通过then/catch或async/await处理结果。
方案一:通过$expand关联查询(推荐,单次API调用)
利用OData的$expand语法,在检索主记录时同时获取关联Lookup记录的名称,无需额外API请求。
代码示例
// 注意:导航属性名称需根据实际实体定义调整(可在Dynamics 365解决方案的实体字段中查看“关联名称”) Xrm.WebApi.retrieveRecord( sellTo[0].entityType, customerId, '?$select=name,_kk_paymentterms_value,_kk_shippingmethod_value,_kk_freightterms_value&$expand=kk_paymentterms,kk_shippingmethod,kk_freightterms' ) .then(function(result) { // 构建每个Lookup字段的完整实体引用对象 const paymentTermsLookup = { id: result._kk_paymentterms_value, name: result.kk_paymentterms.name, entityType: result.kk_paymentterms["@odata.type"].split('.')[1] // 从OData类型中提取实体逻辑名 }; const shippingMethodLookup = { id: result._kk_shippingmethod_value, name: result.kk_shippingmethod.name, entityType: result.kk_shippingmethod["@odata.type"].split('.')[1] }; const freightTermsLookup = { id: result._kk_freightterms_value, name: result.kk_freightterms.name, entityType: result.kk_freightterms["@odata.type"].split('.')[1] }; // 示例:用上述对象设置其他实体的Lookup字段 // Xrm.WebApi.updateRecord("目标实体逻辑名", "目标记录ID", { // "_kk_targetpaymentterms_value": paymentTermsLookup, // "_kk_targetshippingmethod_value": shippingMethodLookup, // "_kk_targetfreightterms_value": freightTermsLookup // }); }) .catch(function(error) { console.error("检索记录失败: ", error.message); });
导航属性名称确认方法
在Dynamics 365的解决方案中:
- 打开主实体(即
sellTo[0].entityType对应的实体) - 找到
kk_paymentterms这类Lookup字段 - 查看字段的关联名称,这就是
$expand需要用的导航属性名(通常和字段名前缀一致,比如字段_kk_paymentterms_value的关联名称是kk_paymentterms)
方案二:单独检索Lookup记录名称(多次API调用)
如果已经获取了Lookup字段的ID,可单独调用retrieveRecord获取对应记录的名称,适合场景复杂的情况。
代码示例
// 先获取主记录的Lookup ID Xrm.WebApi.retrieveRecord( sellTo[0].entityType, customerId, '?$select=_kk_paymentterms_value,_kk_shippingmethod_value,_kk_freightterms_value' ) .then(function(result) { const paymentTermsId = result._kk_paymentterms_value; const shippingMethodId = result._kk_shippingmethod_value; const freightTermsId = result._kk_freightterms_value; // 并行请求三个Lookup记录的名称 return Promise.all([ Xrm.WebApi.retrieveRecord("kk_paymentterm", paymentTermsId, '?$select=name'), Xrm.WebApi.retrieveRecord("kk_shippingmethod", shippingMethodId, '?$select=name'), Xrm.WebApi.retrieveRecord("kk_freightterm", freightTermsId, '?$select=name') ]); }) .then(function(lookupResults) { // 构建Lookup对象(注意需提前保留ID变量,可通过闭包或Promise传递) const paymentTermsLookup = { id: paymentTermsId, name: lookupResults[0].name, entityType: "kk_paymentterm" }; // 后续设置字段逻辑... }) .catch(function(error) { console.error("操作失败: ", error.message); });
关键注意事项
- 所有
Xrm.WebApi方法都是异步的,必须使用异步语法处理结果,不能直接同步赋值。 - 实体逻辑名称需与Dynamics 365中定义的一致,避免拼写错误。
内容的提问来源于stack exchange,提问作者Kostas Karagiannis
相关产品推荐
相关产品推荐

