2

TFS APIを使用して作業項目とそれにリンクされているすべての作業項目(以下のコード)を取得する作業コード(John Socha-Leialohaに感謝)があります。ただし、私がやろうとしているのは、各作業項目のリンクされたファイル(TFSでは「バージョン管理された項目」と呼ばれます)の名前にアクセスすることです。TFS GUIでは、ファイルを作業項目にリンクできます。作業項目1234がファイルfoo.txtにリンクされているとします。このクエリを実行してリンクされたアイテムを見つけると、そのファイルはリストに含まれていません。他の子WIまたは親WIのみが返されます。クエリを完全にGUIで作成して実行した場合も、同じ結果になります。特定のWIにリンクされているファイルを確認するにはどうすればよいですか?私が今できる唯一の方法は、TFS GUIでWIを確認することです。これは、右下のファイルリストに表示されます。

おそらく、通常のフラットクエリを実行し、WIフィールドをフェッチする必要があります。どういうわけか、リンクされたファイルの名前は、そのWIのフィールドの1つになりますか?リンクされたファイルをダウンロードする必要はありません。必要なのはファイル名/場所だけです。

リンクされたすべての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();
}
4

1 に答える 1

2

作業項目クエリは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));
}

XML ドキュメントには、メソッドVersionControlServerを使用して正しいファイル バージョンを取得するために必要なすべての情報が含まれています。GetItem()

于 2013-02-21T19:30:23.367 に答える