代码之家  ›  专栏  ›  技术社区  ›  Dima Shivrin

TFS获取具有关系和子项的项

  •  1
  • Dima Shivrin  · 技术社区  · 6 年前

    我需要一些微软TFS的帮助。(或VST,如果我错了,请纠正我)

    我想得到,对于一个给定的项目,所有的关系和孩子。 我能够得到关系,但我不了解子项(例如给定backlog下的所有任务,以及所有相关的任务/bug等)。最后,我想展示一个树(或者一个带有所有关系的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),并递归地获取它的所有子级和关系。看来我只知道关系。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Eddie Chen - MSFT    6 年前

        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
    
        2
  •  2
  •   starian chen-MSFT    6 年前

    例如:

     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

        3
  •  0
  •   adam.k    5 年前

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

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