C# 如何检索链接的“;“版本化项目”;来自TFS

C# 如何检索链接的“;“版本化项目”;来自TFS,c#,api,tfs,hyperlink,C#,Api,Tfs,Hyperlink,我有一个工作代码(感谢John Socha Leialoha),它使用TFS API检索工作项及其所有链接的工作项(下面的代码)。然而,我试图做的是访问每个工作项的链接文件的名称(TFS称之为“版本化项”)。在TFS GUI中,可以将文件链接到工作项。假设工作项1234链接到文件foo.txt。现在,当我运行此查询以查找链接项时,该文件不在列表中-只返回其他子WI或父WI。如果我完全在GUI中创建和运行查询,结果也是一样的。如何找出哪些文件链接到给定的WI?我现在唯一能做的就是查看TFS GUI

我有一个工作代码(感谢John Socha Leialoha),它使用TFS API检索工作项及其所有链接的工作项(下面的代码)。然而,我试图做的是访问每个工作项的链接文件的名称(TFS称之为“版本化项”)。在TFS GUI中,可以将文件链接到工作项。假设工作项1234链接到文件foo.txt。现在,当我运行此查询以查找链接项时,该文件不在列表中-只返回其他子WI或父WI。如果我完全在GUI中创建和运行查询,结果也是一样的。如何找出哪些文件链接到给定的WI?我现在唯一能做的就是查看TFS GUI中的WI,它显示在右下角的文件列表中

也许我只需要做一个普通的平面查询,获取WI字段,然后链接文件的名称就会成为WI的字段之一?我不需要下载链接文件,我只需要文件名/位置

返回所有链接WI的代码如下:

public List<string> GetLinkedItems()
{
    //executes a linked item query, returning work items, as well as the items that are link to them.
    //gets digital asset work item that contains the given part number in the Assoc. Parts field
    var result = new List<string>();
    var tpc = new TfsTeamProjectCollection(new Uri(_tfsUri));
    var workItemStore = (WorkItemStore) tpc.GetService(typeof (WorkItemStore));
    //and [Schilling.TFS.TechPub.AssocParts] CONTAINS '101-4108' 
    var query =
        "SELECT [System.Id], [System.Links.LinkType], [System.TeamProject]," +
        " [System.WorkItemType], [System.Title], [System.AssignedTo]," +
        " [System.State] FROM WorkItemLinks " +
        " WHERE ([Source].[System.TeamProject] = 'Tech Pubs'  AND " +
        " [Source].[System.WorkItemType] = 'DigitalAsset'  AND " +
        " [Source].[System.State] <> '') And " +
        " ([System.Links.LinkType] <> '') And " +
        " ([Target].[System.WorkItemType] <> '') " +
        " ORDER BY [System.Id] mode(MayContain)";
    var treeQuery = new Query(workItemStore, query);
    //Note we need to call RunLinkQuery here, not RunQuery, because we are doing a link item type of query
    var links = treeQuery.RunLinkQuery();

    //// Build the list of work items for which we want to retrieve more information//
    int[] ids = (from WorkItemLinkInfo info in links
                 select info.TargetId).Distinct().ToArray();

    //
    // Next we want to create a new query that will retrieve all the column values from the original query, for
    // each of the work item IDs returned by the original query.
    //
    var detailsWiql = new StringBuilder();
    detailsWiql.AppendLine("SELECT");
    bool first = true;

    foreach (FieldDefinition field in treeQuery.DisplayFieldList)
    {
        detailsWiql.Append("    ");
        if (!first)
            detailsWiql.Append(",");
        detailsWiql.AppendLine("[" + field.ReferenceName + "]");
        first = false;
    }
    detailsWiql.AppendLine("FROM WorkItems");
    //
    // Get the work item details
    //
    var flatQuery = new Query(workItemStore, detailsWiql.ToString(), ids);
    WorkItemCollection details = flatQuery.RunQuery();

    return
        (from WorkItem wi in details
         select wi.Id + ", " + wi.Project.Name + ", " + wi.Title + ", " + wi.State).ToList();
}
公共列表GetLinkedItems()
{
//执行链接项查询,返回工作项以及链接到它们的项。
//获取在“关联零件”字段中包含给定零件号的数字资产工作项
var result=新列表();
var tpc=new-tfstreamprojectcollection(新Uri(_-tfsUri));
var workItemStore=(workItemStore)tpc.GetService(typeof(workItemStore));
//[Schilling.TFS.TechPub.AssocParts]包含“101-4108”
变量查询=
选择[System.Id]、[System.Links.LinkType]、[System.TeamProject]+
“[System.WorkItemType],[System.Title],[System.AssignedTo],”+
“[System.State]来自WorkItemLinks”+
“其中([Source].[System.TeamProject]='Tech pub'和”+
“[Source]。[System.WorkItemType]='DigitalAsset'和”+
“[Source]。[System.State]”)和”+
([System.Links.LinkType]“”)和+
([Target].[System.WorkItemType]“”)+
“按[System.Id]模式订购(可能包含)”;
var treeQuery=新查询(workItemStore,查询);
//注意,我们需要在这里调用RunLinkQuery,而不是RunQuery,因为我们正在执行链接项类型的查询
var links=treeQuery.RunLinkQuery();
////构建要检索更多信息的工作项列表//
int[]id=(来自链接中的WorkItemLinkInfo信息
选择info.TargetId).Distinct().ToArray();
//
//接下来,我们要创建一个新查询,该查询将从原始查询中检索所有列值,例如
//原始查询返回的每个工作项ID。
//
var detailsWiql=新的StringBuilder();
detailsWiql.AppendLine(“选择”);
bool first=true;
foreach(treeQuery.DisplayFieldList中的字段定义字段)
{
detailsWiql.Append(“”);
如果(!第一个)
detailsWiql.Append(“,”);
detailsWiql.AppendLine(“[”+field.ReferenceName+“]”);
第一个=假;
}
detailsWiql.AppendLine(“来自工作项”);
//
//获取工作项的详细信息
//
var flatQuery=新查询(workItemStore,detailsWiql.ToString(),ids);
WorkItemCollection details=flatQuery.RunQuery();
返回
(详细信息来自WorkItem wi)
选择wi.Id+”、“+wi.Project.Name+”、“+wi.Title+”、“+wi.State).ToList();
}

工作项查询只能显示
WorkItemLinkType
链接。要获取其他类型的链接(即源代码管理中的文件),您需要浏览
WorkItem
对象本身中的链接列表。下面是一段代码,它将为您获取链接到工作项的文件的工件:

TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(
    new Uri("http://<server>:8080/tfs/<collection>"));

WorkItemStore wiStore = tpc.GetService<WorkItemStore>();

VersionControlServer vc = tpc.GetService<VersionControlServer>();

WorkItem task = wiStore.GetWorkItem(<work item with a linked file>);

var externalLinks = task.Links.OfType<ExternalLink>();

foreach (var link in externalLinks)
{
    XmlDocument artifact = vc.ArtifactProvider.GetArtifactDocument(new Uri(link.LinkedArtifactUri));
}
tfstreamprojectcollection tpc=tfstreamprojectcollectionfactory.GetTeamProjectCollection(
新Uri(“http://:8080/tfs/”);
WorkItemStore-wiStore=tpc.GetService();
VersionControlServer vc=tpc.GetService();
WorkItem task=wiStore.GetWorkItem();
var externalLinks=task.Links.OfType();
foreach(外部链接中的var链接)
{
XmlDocument artifact=vc.ArtifactProvider.GetArtifactDocument(新Uri(link.LinkedArtifactUri));
}

XML文档包含使用
GetItem()
方法从
VersionControlServer
获取正确文件版本所需的所有必要信息

非常感谢,这正是我所需要的!从这段代码中,你如何知道谁是孩子的父母?