旧TeamFoundation客户端中RelatedLink替换为新REST WebApi模型的方案
适配新API实现原逻辑的方案
原代码核心是从指定工作项it的链接中,找到同项目、ID为id的"Related"类型非层级关联工作项,针对你使用的GetReportingLinksByLinkTypeAsyncAPI,可按以下思路调整:
核心调整思路
- 先获取项目内所有"Related"类型的链接(排除层级相关的链接类型)
- 筛选出同时关联目标工作项
it.Id和指定id的双向链接 - 验证两个工作项同属一个项目(若API返回的链接已包含项目信息,可直接判断;否则需获取工作项详情验证)
- 匹配成功后获取对应的工作项赋值给
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
相关产品推荐
相关产品推荐

