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

Куда мне идти дальше?


person JF Beaulieu    schedule 17.02.2012    source источник


Ответы (2)


Это работает на 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);
person Michael Logutov    schedule 27.01.2014
comment
Я смог использовать этот фрагмент, вставить его в свой код и заставить его работать за тридцать секунд. Отлично. - person JohnZaj; 15.12.2014

Нашел решение, которое возвращает родительский 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;
    }
person JF Beaulieu    schedule 17.02.2012
comment
вы можете расширить свой запрос, используя режим (mustcontain), чтобы получать только запросы с указанным типом ссылки, таким образом вы точно знаете, что получаете нужные: SELECT [System.Id] FROM WorkItemLinks WHERE ([Source].[System.WorkItemType] = 'User Story') And ([System.Links.LinkType] = 'Parent')) mode(MustContain) (См .: msdn.microsoft.com/en-us/library/bb130306.aspx#sectionToggle2) - person jessehouwing; 21.02.2012