2012-02-17 47 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

相關問題