C# 查找与工作项关联或具有特定注释的变更集TFS Api

C# 查找与工作项关联或具有特定注释的变更集TFS Api,c#,tfs,C#,Tfs,我正在尝试使用Microsoft.TeamFoundation.WorkItemTracking.Client查找与工作项关联的所有变更集。使用query,我能够获得有关有问题的工作项的信息,但是我找不到关于我要返回的对象的任何变更集信息。除此之外,还有一些变更集没有链接到特定的工作项,但很容易通过注释识别。有没有一种使用TFSAPI快速查找这些内容的方法 编辑:在该问题中,这不是b/c的副本。此人有一个变更集,并希望查找关联的工作项。在我的例子中,我有一个工作项,我希望找到与特定工作项关联的所

我正在尝试使用Microsoft.TeamFoundation.WorkItemTracking.Client查找与工作项关联的所有变更集。使用query,我能够获得有关有问题的工作项的信息,但是我找不到关于我要返回的对象的任何变更集信息。除此之外,还有一些变更集没有链接到特定的工作项,但很容易通过注释识别。有没有一种使用TFSAPI快速查找这些内容的方法

编辑:在该问题中,这不是b/c的副本。此人有一个变更集,并希望查找关联的工作项。在我的例子中,我有一个工作项,我希望找到与特定工作项关联的所有变更集。除此之外,我需要在注释中找到所有具有特定字符串的变更集。

检查:


在对该主题进行了更多的谷歌搜索并探索了tfs API之后,我得出了以下结论:

如果所有变更集都链接到工作项(这不是我的情况,但这是我最初询问的):

//基于https://etoptanci.wordpress.com/2011/05/04/seeing-all-code-changes-for-a-work-item/
私有静态void GetChangesForWorkItem()
{
var configurationServer=TfsConfigurationServerFactory.GetConfigurationServer(新Uri(@)http://myserver:8080/tfs"));
var tpcService=configurationServer.GetService();
var collectionNodes=configurationServer.CatalogNode.QueryChildren(
新[]{CatalogResourceTypes.ProjectCollection},
错误,目录查询选项。无);
var collectionNode=collectionNodes.First(x=>x.Resource.DisplayName==“”);
//使用InstanceId属性获取团队项目集合
Guid collectionId=新Guid(collectionNode.Resource.Properties[“InstanceId”]);
TfsTeamProjectCollection=configurationServer.GetTeamProjectCollection(collectionId);
var vcs=collection.GetService();
var store=新工作项store(集合);
var workItems=新列表()
{
store.GetWorkItem(1123),
store.GetWorkItem(1145),
};
var associatedChangesets=新列表();
foreach(工作项中的var工作项)
{
foreach(workItem.Links中的变量链接)
{
如果((链接==null)| |!(链接为外部链接))
继续;
字符串externalLink=((externalLink)link.LinkedArtifactUri;
var artifact=LinkingUtilities.DecodeUri(externalLink);
if(artifact.ArtifactType==“变更集”)
添加(vcs.ArtifactProvider.GetChangeset(新Uri(externalLink));
}
}
WriteLine(associatedChangesets.Select(x=>x.ChangesetId).OrderBy(x=>x));
}
如果您还需要通过注释获取,那么您可以对日期范围的所有变更集进行选通,然后通过Changeset.comment(一个字符串)进行过滤。

您也可以使用RestAPI(如第一个答案中所述)


您需要用rel==“ArtifactLink”

过滤掉“relations”数组,因为您使用的是哪个版本的TFS?@DaveShaw,情况正好相反:我没有变更集,但我有一个工作项或注释。@Cece MSFT,我们使用的是TFS 2015,因为您使用的是TFS 2015,您可以检查REST API而不是.net API。可以使用:var extLink=link作为ExternalLink;如果(link==null)继续;这样,您就不必使用“is ExternalLink”,然后在cast中重复“ExternalLink”。看见
GET https://{instance}/defaultcollection/_apis/tfvc/changesets/{id}?api-version={version}[&includedetails={boolean}&includeworkitems={boolean}&includesourcerenames={boolean}&maxchangecount={int}&maxcommentlength={int}]
// based on https://etoptanci.wordpress.com/2011/05/04/seeing-all-code-changes-for-a-work-item/
private static void GetChangesForWorkItem()
{
    var configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(@"http://myserver:8080/tfs"));
    var tpcService = configurationServer.GetService<ITeamProjectCollectionService>();
    var collectionNodes = configurationServer.CatalogNode.QueryChildren(
           new[] { CatalogResourceTypes.ProjectCollection },
           false, CatalogQueryOptions.None);

    var collectionNode = collectionNodes.First(x => x.Resource.DisplayName == "<collection name>");

    // Use the InstanceId property to get the team project collection
    Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
    TfsTeamProjectCollection collection = configurationServer.GetTeamProjectCollection(collectionId);
    var vcs = collection.GetService<VersionControlServer>();
    var store = new WorkItemStore(collection);
    var workItems = new List<WorkItem>()
    {
        store.GetWorkItem(1123),
        store.GetWorkItem(1145),
    };

    var associatedChangesets = new List<Changeset>();

    foreach (var workItem in workItems)
    {
        foreach (var link in workItem.Links) 
        {
            if((link==null) || !(link is ExternalLink))
            continue;

            string externalLink = ((ExternalLink)link).LinkedArtifactUri;
            var artifact =LinkingUtilities.DecodeUri(externalLink);

            if (artifact.ArtifactType == "Changeset")
                associatedChangesets.Add(vcs.ArtifactProvider.GetChangeset(new Uri(externalLink)));
        }
    }

    Console.WriteLine(associatedChangesets.Select(x=>x.ChangesetId).OrderBy(x => x));
}