我需要有关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。
答案 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);
}
}
}
}
结果将是这样的:
答案 2 :(得分:0)
我只是遇到了类似的问题,要获取有关Relations的信息,您需要做的是使用GetWorkItemAsync方法的WorkItemExpand参数:
var item = client.GetWorkItemAsync(c_projectName, id, null, null, WorkItemExpand.Relations).Result;
如果不使用此参数,则Relations属性将为null。