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

Обнаружено решение, которое возвращает родительский 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

вы можете расширить свой запрос, используя режим (mustcontain) для извлечения только запросы с указанным типом связи, что, как вы знаете наверняка, что вы извлечения правильные: 'SELECT [System.Id] FROM WorkItemLinks WHERE ([Source]. [System.WorkItemType] = 'Пользовательская история") И ([System.Links.LinkType] =' Parent ')) (MustContain) '(см .: http://msdn.microsoft.com/en-us/library/bb130306.aspx#sectionToggle2) – jessehouwing

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

Смежные вопросы