【问题标题】:TFS API - How to obtain the parent of a work itemTFS API - 如何获取工作项的父项
【发布时间】:2014-01-27 18:45:32
【问题描述】:

我的最终目标是递归地一次获取一个工作项的父级,直到层次结构中不再有父级。目前,还没有递归,我仍在优化获取父工作项的方式。我想到了一种涉及查询的方法:

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"];

我该去哪里?

【问题讨论】:

    标签: c# tfs tfs-sdk


    【解决方案1】:

    这适用于 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);
    

    【讨论】:

    • 我能够使用这个 sn-p 并将其放入我的代码中,并在 30 秒内使其工作。不错。
    【解决方案2】:

    找到一个解决方案,如果有父级则返回父级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;
        }
    

    【讨论】:

    • 您可以使用 mode(mustcontain) 扩展查询以仅获取具有指定链接类型的查询,这样您就可以确定您正在检索正确的查询:SELECT [System.Id] FROM WorkItemLinks WHERE ([Source].[System.WorkItemType] = 'User Story') And ([System.Links.LinkType] = 'Parent')) mode(MustContain)(参见:@ 987654321@)
    猜你喜欢
    • 2014-07-10
    • 2017-12-27
    • 2012-03-05
    • 2019-03-11
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多