为何Azure DevOps中WorkItems与WorkItemLinks WIQL查询结果不同?
为什么Azure DevOps的WIQL WorkItemLinks查询和普通WorkItems查询结果差异巨大?
核心原因:两类查询的本质完全不同
你的两个查询看似都是针对「To Do状态的工作项」,但底层逻辑天差地别:
- 原WorkItems查询:直接返回所有符合条件的独立工作项,不管该工作项有没有和其他项建立链接关系。
- WorkItemLinks查询:返回的是链接关系对(Source → Target),只有存在链接关系的工作项才会被纳入结果集。
具体差异的细节
缺失原查询的项
那些没有任何父/子/关联等链接的To Do工作项,会完全从WorkItemLinks查询结果中消失——因为它们没有参与任何链接关系,无法作为Target出现在链接对里。多出原查询没有的项
- 你的查询没有指定链接类型,会匹配所有链接类型(父-子、关联、依赖、引用等),导致大量无关的
Source端工作项被返回(比如某个To Do工作项的关联项,哪怕关联项状态不是To Do)。 - 如果一个To Do工作项存在多个链接(比如同时被父项和其他项关联),会多次出现在结果中,进一步放大结果差异。
- 你的查询没有指定链接类型,会匹配所有链接类型(父-子、关联、依赖、引用等),导致大量无关的
正确获取To Do工作项及其父项的WIQL写法
要同时拿到To Do工作项和对应的父项,需要明确指定链接类型,并可选包含无父项的工作项:
SELECT [Source].[System.Id] AS ParentId, [Target].[System.Id] AS WorkItemId FROM WorkItemLinks WHERE [Source].[System.TeamProject] = @project AND [Target].[System.TeamProject] = @project AND [Target].[State] = 'To Do' AND [System.LinkType] = 'System.LinkTypes.Hierarchy-Reverse' INCLUDE NODE(*, [Target].[System.Id])
System.LinkTypes.Hierarchy-Reverse:限定只匹配父→子的层级链接,确保Source是父项,Target是子项。INCLUDE NODE(*, [Target].[System.Id]):强制包含没有父项的To Do工作项,此时对应的ParentId会为NULL。
内容的提问来源于stack exchange,提问作者David Carli-Arnold
相关产品推荐
相关产品推荐

