TFS API - 如何获取工作项的父级

4

我的最终目标是递归地获取一个工作项的父项,直到层次结构中没有更多的父项。目前还没有递归的实现,我仍在优化获取父项的方式。我考虑使用一种查询的方式来完成这个任务:

public WorkItem GetParentWorkItem(int id)
{
    StringBuilder queryString = new StringBuilder("SELECT [System.Id]" +    
                                                  " FROM WorkItemLinks " +
                                                  " WHERE [Source].[System.WorkItemType] = '" + TFS_TIMESHEET_WORK_ITEM_TYPE + "'"  +
                                                  " AND [Source].[System.TeamProject] = '" + TFS_TIMESHEET_PROJECT_KEY + "'" +
                                                  " AND [Source].[System.Id] = " + id 
                                                  );
    Query wiQuery = new Query(GetWorkItemStore, queryString.ToString());
    WorkItemLinkInfo[] wiTrees = wiQuery.RunLinkQuery();
    WorkItem wi = GetWorkItemStore.GetWorkItem(wiTrees[1].TargetId);

    return wi;
}

这种方法的问题在于它获取了所有链接的工作项,包括前置、后继、子项和父项。我知道wiTrees[1]是父工作项,所以我硬编码了索引。
我找到了一种方法从工作项存储中获取“父级”WorkItemTypeEnd对象:
WorkItemLinkTypeEnd linkTypEnd = GetWorkItemStore.WorkItemLinkTypes.LinkTypeEnds["Parent"];

我该从哪里开始?

2个回答

12

这在 TFS 2013 上有效:

var parent_link = work_item.WorkItemLinks.Cast<WorkItemLink> ().FirstOrDefault (x => x.LinkTypeEnd.Name == "Parent");

WorkItem parent_work_item = null;
if (parent_link != null)
    parent_work_item = work_item_store.GetWorkItem (parent_link.TargetId);

我能够使用这个代码片段并将其嵌入到我的代码中,在30秒内使其工作。不错。 - JohnZaj

7
发现了一个解决方案,如果存在父项,则返回父WorkItem,如果不存在则返回null。
public WorkItem GetParentWorkItem(int id)
    {
        StringBuilder queryString = new StringBuilder("SELECT [System.Id]" +    
                                                      " FROM WorkItemLinks " +
                                                      " WHERE [Source].[System.WorkItemType] = '" + TFS_TIMESHEET_WORK_ITEM_TYPE + "'" +
                                                      " AND [Source].[System.TeamProject] = '" + TFS_TIMESHEET_PROJECT_KEY + "'" +
                                                      " AND [Source].[System.Id] = " + id 
                                                      );
        Query wiQuery = new Query(GetWorkItemStore, queryString.ToString());
        WorkItemLinkInfo[] wiTrees = wiQuery.RunLinkQuery();

        int parentLinkId = GetWorkItemStore.WorkItemLinkTypes.LinkTypeEnds["Parent"].Id;

        foreach (WorkItemLinkInfo linkInfo in wiTrees)
        {
            // -2 is the LinkTypeId for parent
            if (linkInfo.LinkTypeId == parentLinkId)
            {
                workItem = GetWorkItemStore.GetWorkItem(linkInfo.TargetId);
                break;
            }
            else
            {
                workItem = null;
            }
        }
        return workItem;
    }

1
您可以使用mode(mustcontain)扩展查询,以仅获取具有指定链接类型的查询,这样您就可以确保检索到正确的查询:SELECT [System.Id] FROM WorkItemLinks WHERE ([Source].[System.WorkItemType] = 'User Story') And ([System.Links.LinkType] = 'Parent')) mode(MustContain)(参见:http://msdn.microsoft.com/en-us/library/bb130306.aspx#sectionToggle2) - jessehouwing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接