如何通过C#获取Dynamics CRM中的关系元数据描述?
获取Dynamics CRM关系描述的C#实现
当然可以获取关系的描述信息!你没在OneToManyMetadata里找到是因为这个描述并不直接作为该对象的顶级属性存在,而是存储在元数据对象的**Description属性**中——这是所有MetadataBase派生类(包括OneToManyMetadata、ManyToManyRelationshipMetadata等)共有的属性,它是一个LocalizedLabel类型,包含了多语言的描述内容。
具体实现步骤
- 使用
RetrieveRelationshipRequest请求来获取目标关系的元数据 - 从返回的
RetrieveRelationshipResponse中提取关系元数据对象(根据关系类型转为OneToManyMetadata或ManyToManyRelationshipMetadata) - 访问元数据对象的
Description属性,获取对应的本地化描述(如果有多个语言版本,可根据LanguageCode筛选)
C#代码示例
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; using System.Linq; public string GetRelationshipDescription(IOrganizationService service, string relationshipName) { // 创建检索关系元数据的请求 var retrieveRequest = new RetrieveRelationshipRequest { Name = relationshipName, MetadataId = Guid.Empty, // 如果知道MetadataId也可以用这个,优先级更高 RetrieveAsIfPublished = true // 获取已发布的元数据 }; // 执行请求并获取响应 var retrieveResponse = (RetrieveRelationshipResponse)service.Execute(retrieveRequest); var relationshipMetadata = retrieveResponse.RelationshipMetadata; // 处理一对多关系 if (relationshipMetadata is OneToManyMetadata oneToMany) { // 获取当前用户语言对应的描述,也可指定语言代码(如1033代表英语) var descriptionLabel = oneToMany.Description.UserLocalizedLabel ?? oneToMany.Description.LocalizedLabels.FirstOrDefault(); return descriptionLabel?.Label ?? "未找到描述信息"; } // 处理多对多关系 else if (relationshipMetadata is ManyToManyRelationshipMetadata manyToMany) { var descriptionLabel = manyToMany.Description.UserLocalizedLabel ?? manyToMany.Description.LocalizedLabels.FirstOrDefault(); return descriptionLabel?.Label ?? "未找到描述信息"; } return "不支持的关系类型"; }
补充说明
- 传入的
relationshipName必须是关系的架构名称(而非显示名称),可在Dynamics 365解决方案管理器的关系详情中查看 UserLocalizedLabel会自动返回当前登录用户语言对应的描述,无需手动指定语言代码- 需确保项目引用了正确的SDK包:
Microsoft.CrmSdk.CoreAssemblies(或对应版本的Dynamics 365 SDK NuGet包)
内容的提问来源于stack exchange,提问作者Muzammil
相关产品推荐
相关产品推荐

