2012-02-17 61 views
4

我的最终目标是获得一个工作项目的母体在时间递归,直到没有更多的家长在层次中。目前,没有任何递归然而,我仍然是优化我得到父母的工作项目的方式点。我已经想到了这样做涉及查询的一种方式:TFS API - 如何获取一个工作项的父

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

我在哪里何去何从?

回答

6

实测值的溶液中,如果有一个父,如果不是返回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

您可以使用模式(mustcontain)获取仅使用指定的链接类型的查询扩展您的查询,你肯定知道你检索这样是正确的:'SELECT [System.Id] FROM WorkItemLinks WHERE([来源] [System.WorkItemType] = '用户故事'。) 和([System.Links.LinkType] = '父')) 模式(MustContain)'(参见:http://msdn.microsoft.com/en-us/library/bb130306.aspx#sectionToggle2) – jessehouwing 2012-02-20 22:33:16

11

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

我能使用这段代码并将其放入我的代码中,并在三十秒内完成。尼斯。 – JohnZaj 2014-12-14 22:07:13

相关问题