You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Master Data Services(MDS) WCF API获取域属性值

解决MDS WCF API域属性取值问题

我之前在做MDS WCF API集成的时候也踩过这个坑!不得不说MDS的官方文档确实不够清晰,特别是域属性这块的取值逻辑,和普通属性完全不一样。我来分享下我当时解决的方法:

核心逻辑:域属性的本质是关联实体成员

域属性其实是当前实体和另一个实体的关联,所以它的Value存储的是关联成员的Code,而不是直接显示的名称或其他属性。如果要获取关联成员的详细信息(比如名称),需要在请求中启用返回关联成员数据,再从返回结果中匹配。

步骤1:调用EntityMembersGet时启用域属性关联数据

在构建EntityMembersGetRequest的时候,一定要把ReturnDomainAttributes设为true,否则API不会返回关联的成员数据:

// 初始化请求对象
var getRequest = new EntityMembersGetRequest
{
    MembersGetCriteria = new MembersGetCriteria
    {
        ModelId = new Identifier { Name = "你的模型名称" },
        EntityId = new Identifier { Name = "你的目标实体名称" },
        VersionId = new Identifier { Name = "你的版本名称" }, // 比如"VERSION_1"
        ReturnDomainAttributes = true, // 关键配置:必须开启才能拿到关联成员数据
        // 可以加上其他筛选条件,比如指定成员Code
        MemberReturnCriteria = new MemberReturnCriteria
        {
            MemberCodes = new List<MemberCode> { new MemberCode { Value = "要查询的成员Code" } }
        }
    }
};

// 调用API获取数据
var client = new MetadataServiceClient(); // 或者你自己初始化的WCF客户端
var getResponse = client.EntityMembersGet(getRequest);

步骤2:区分普通属性和域属性并取值

返回的EntityMembers对象里,有两个关键集合:

  • Members:当前实体的成员列表
  • RelatedMembers:所有域属性关联的成员列表

遍历成员属性时,通过Attribute.DomainEntityId判断是否为域属性:

foreach (var member in getResponse.EntityMembers.Members)
{
    Console.WriteLine($"===== 成员Code: {member.Code.Value} =====");
    
    foreach (var attr in member.Attributes)
    {
        var attrName = attr.AttributeId.Name;
        
        if (attr.DomainEntityId != null)
        {
            // 这是域属性:Value是关联成员的Code
            var relatedCode = attr.Value?.ToString();
            
            // 从RelatedMembers中匹配对应的关联成员
            var relatedMember = getResponse.EntityMembers.RelatedMembers
                .FirstOrDefault(rm => 
                    rm.Code.Value == relatedCode 
                    && rm.EntityId.Id == attr.DomainEntityId.Id);
            
            if (relatedMember != null)
            {
                // 假设关联实体的名称属性叫"Name",可以根据实际属性名修改
                var relatedName = relatedMember.Attributes
                    .FirstOrDefault(a => a.AttributeId.Name == "Name")?.Value?.ToString();
                
                Console.WriteLine($"{attrName}: {relatedName} (关联Code: {relatedCode})");
            }
            else
            {
                Console.WriteLine($"{attrName}: {relatedCode} (未找到关联成员)");
            }
        }
        else
        {
            // 普通属性直接取Value
            Console.WriteLine($"{attrName}: {attr.Value?.ToString()}");
        }
    }
}

额外说明

  • 如果你的域属性是多值类型(比如一个成员关联多个其他实体成员),那么需要用attr.Values集合来获取所有关联的Code,再逐个匹配RelatedMembers。
  • 确保你有权限访问关联的实体,否则RelatedMembers可能返回空。
  • 可以通过attr.AttributeId.Id或Name来精准定位特定属性,避免遍历所有属性。

内容的提问来源于stack exchange,提问作者RJD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:22:12