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

旧TeamFoundation客户端中RelatedLink替换为新REST WebApi模型的方案

适配新API实现原逻辑的方案

原代码核心是从指定工作项it的链接中,找到同项目、ID为id的"Related"类型非层级关联工作项,针对你使用的GetReportingLinksByLinkTypeAsyncAPI,可按以下思路调整:

核心调整思路

  1. 先获取项目内所有"Related"类型的链接(排除层级相关的链接类型)
  2. 筛选出同时关联目标工作项it.Id和指定id的双向链接
  3. 验证两个工作项同属一个项目(若API返回的链接已包含项目信息,可直接判断;否则需获取工作项详情验证)
  4. 匹配成功后获取对应的工作项赋值给root

代码示例

// 获取项目内的链接类型列表,筛选出目标"Related"类型(排除层级类)
var linkTypes = await httpClient.GetReportingLinkTypesAsync(project).ConfigureAwait(false);
var targetLinkType = linkTypes.FirstOrDefault(lt => 
    lt.Name == "Related" && !lt.ImmutableName.Contains("Hierarchy"));

if (targetLinkType == null)
{
    // 未找到目标链接类型,可添加对应处理逻辑
    return;
}

// 获取该链接类型下的所有关联链接
var allRelatedLinks = await httpClient.GetReportingLinksByLinkTypeAsync(project, targetLinkType.Name).ConfigureAwait(false);

// 筛选出同时关联当前工作项it和指定id的双向链接
var matchingLink = allRelatedLinks.FirstOrDefault(link => 
    (link.SourceWorkItemId == it.Id && link.TargetWorkItemId == id) || 
    (link.SourceWorkItemId == id && link.TargetWorkItemId == it.Id));

if (matchingLink != null)
{
    try
    {
        // 获取关联工作项详情
        var susp = await httpClient.GetWorkItemAsync(id).ConfigureAwait(false);
        // 验证项目一致性
        if (it.Fields["System.TeamProject"].ToString() == susp.Fields["System.TeamProject"].ToString())
        {
            root = susp;
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
}

关键说明

  • 原代码是从单个工作项的链接集合中遍历,新API是从项目维度获取同类型所有链接,因此需要通过双向ID匹配定位目标链接
  • 若项目内Related链接数量过大,可结合API的$filter参数(根据Azure DevOps SDK版本调整),按工作项ID范围过滤结果提升性能
  • 若GetReportingLinksByLinkTypeAsync返回的链接数据已包含项目名称字段,可直接用matchingLink.SourceProjectName和matchingLink.TargetProjectName验证,无需额外获取工作项详情

内容的提问来源于stack exchange,提问作者Linus Flemström

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:10:05