TFS获取带有关系和子项的项目

时间:2018-08-30 15:29:10

标签: c# tfs visual-studio-2017 azure-devops

我需要有关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获取关系并构建某种树来显示。 我的问题是我不知道如何才能让所有的孩子都得到帮助。

当前,我想向此函数发送一个id数组(或此时为1个id),并递归获取其所有子元素和关系。看来我只得到关系。

我正在使用TFS版本2017,API版本是3.2。

3 个答案:

答案 0 :(得分:1)

所有链接的工作项都包含在关系中,因此您的代码已经获得了子工作项。下一步是检查关系类型,以确定哪个是相关工作项目,哪个是子工作项目。

    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

答案 1 :(得分:1)

仅递归获取所有子级工作项。

例如:

 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

答案 2 :(得分:0)

我只是遇到了类似的问题,要获取有关Relations的信息,您需要做的是使用GetWorkItemAsync方法的WorkItemExpand参数:

var item = client.GetWorkItemAsync(c_projectName, id, null, null, WorkItemExpand.Relations).Result;

如果不使用此参数,则Relations属性将为null。