TFS получить предметы с родственными отношениями и детьми - PullRequest
0 голосов
/ 30 августа 2018

Мне нужна помощь с Microsoft TFS. (Или VSTS, поправьте меня, если я ошибаюсь)

Я хочу получить для данного предмета все это отношения и детей. Я могу получить отношения, но, как я понимаю, не дети (например, все задачи в заданном отставании, и все связанные задачи / ошибки и т. Д.). В конце концов я хотел бы представить дерево (или отображение в стиле GraphQL со всеми связями).

Вот часть моего класса:

using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.TeamFoundation.Client;

using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;

public TfsDataProvider(string tfsInstanceUrl, string tfsCollection)
    {
        TfsInstanceUrl = tfsInstanceUrl.TrimEnd('/');
        TfsCollection = tfsCollection;

        TfsUrlPlusCollection = string.Format("{0}/{1}", tfsInstanceUrl, tfsCollection);

        //tfs nuget packages for API version 3.2:
        creds = new VssCredentials();
        creds.Storage = new VssClientCredentialStorage();

        Uri url = new Uri(TfsUrlPlusCollection); //"http://tfs:8080/tfs/aeronautics-100"

        connection = new VssConnection(url, creds);
        wiClient = connection.GetClient<WorkItemTrackingHttpClient>();

        //tracker = new HashSet<int>();
    }



public List<WorkItem> GetWorkItemsByIds(IEnumerable<int> ids)
{
  var wis = wiClient.GetWorkItemsAsync(ids, null, null, WorkItemExpand.Relations).Result;
  return wis;
}

приведенный выше код работает, и я получаю все элементы и их отношения, затем я могу получить отношения по id и построить своего рода дерево для отображения. Моя проблема в том, что я не понимаю, как мне получить всех детей.

В настоящее время я хочу отправить этой функции массив идентификаторов (или 1 идентификатор в настоящее время) и рекурсивно получить все ее дочерние элементы и отношения. Кажется, я получаю только отношения.

Я использую TFS версии 2017 года, а версия API - 3.2.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Просто рекурсивно заставьте всех детей работать.

Например:

 private static void GetWorkItemsTest()
        {
           //var creds = new VssCredentials();
           // creds.Storage = new VssClientCredentialStorage();
            VssCredentials c = new VssCredentials(new Microsoft.VisualStudio.Services.Common.VssBasicCredential(string.Empty, "{PAT}"));
            Uri url = new Uri("https://starain.visualstudio.com"); 

           var connection = new VssConnection(url, c);
           var wiClient = connection.GetClient<WorkItemTrackingHttpClient>();
            IEnumerable<int> ids = new List<int> { 851, 180 };
            var wis = wiClient.GetWorkItemsAsync(ids, null, null, WorkItemExpand.Relations).Result;
            foreach (WorkItem wi in wis)
            {
                Console.WriteLine(wi.Id);
                GetChildrenWIT(wiClient, wi, 1,new List<int> { wi.Id.Value});
            }
        }
        private static void GetChildrenWIT(WorkItemTrackingHttpClient witClient, WorkItem child, int width,List<int> existingWit)
        { 
            if (child.Relations != null)
            {
                foreach (WorkItemRelation wir in child.Relations)
                {
                    var indent = new string('-', width);
                    int id = int.Parse(wir.Url.Split('/').Last());
                    if(!existingWit.Contains(id))
                    {
                        Console.WriteLine(string.Format("{0}{1}", indent, wir.Rel));
                        var childwit = witClient.GetWorkItemAsync(id, null, null, WorkItemExpand.Relations).Result;
                        existingWit.Add(childwit.Id.Value);
                        Console.WriteLine(string.Format("{0}-{1}", indent, childwit.Id));
                        GetChildrenWIT(witClient, childwit, width+1, existingWit);
                    }         
                }
            }
        }

Результат будет таким:

enter image description here

0 голосов
/ 31 августа 2018

Все связанные рабочие элементы включены в отношения, поэтому ваш код уже получил дочерние рабочие элементы. Следующим шагом является проверка типа отношения, чтобы определить, какой связанный рабочий элемент, а какой - дочерний рабочий элемент.

    foreach (WorkItem wi in wis)
    {
        if (wi.Relations != null)
        {
            foreach (WorkItemRelation wir in wi.Relations)
            {
                Console.WriteLine(wir.Rel);
                Console.WriteLine(wir.Url);
            }
        }
    }

Типы ссылок:

Child:   System.LinkTypes.Hierarchy-Forward
Parent:  System.LinkTypes.Hierarchy-Reverse
Related: System.LinkTypes.Related
...