使用TFS API,如何查找在Code Review上发表的评论?

我正试图找到一种方法来查找有关TFS2012中的代码审查请求/响应项的详细信息。

我可以通过以下方式查询所有代码审查请求/响应项:

const string TfsUri = "http://mytfsserver:8080/tfs/Default ProjectCollection"; var tfs = new TfsTeamProjectCollection(new Uri(TfsUri)); var store = tfs.GetService(); var versionStore = tfs.GetService(); var queryText = "SELECT [System.Id], FROM WorkItems WHERE [System.WorkItemType] = 'Code Review Request' or [System.WorkItemType] = 'Code Review Response'"; var query = new Query(store, queryText); var result = query.RunQuery().OfType(); 

这给了我一个WorkItem类型列表。 当我循环遍历result.FirstOrDefault().Fields属性时,它确实给了我一些有关ShelveSet的有用信息,它与Code Review相关,即“Associated Context”。 使用此信息,我可以查询ShelveSet:

 var versionStore = tfs.GetService(); var shelveset = versionStore.QueryShelvesets("someCodeReviewId_xxxx","someUserName"); 

这给了我一个ShelveSet项目,但那就是我被卡住的地方。

我查看了Microsoft.TeamFoundation.CodeReview.ComponentsMicrosoft.TeamFoundation.CodeReview.Controls库提供的Microsoft.TeamFoundation.CodeReview命名空间,但这对我没有任何帮助。

我的问题是:如何通过TFS API在代码审查期间(包括一般注释和文件注释)找到ShelveSet上的实际注释?

我没有代码示例,但根据此讨论 ,您应该能够使用Microsoft.TeamFoundation.Discussion.Client命名空间中的function获取代码审阅注释。

具体来说,可以通过DiscussionThread类访问注释。 您应该能够使用IDiscussionManager查询讨论。

我们有一个新的要求来从TFS中提取代码评审意见,这是我们实施的一个简短示例。 必须通过另一种方法查询workItemId。 您甚至可以在Visual Studio中或通过UI中的TFS查询进行查找。 这是可用内容和我们正在使用的内容的一小部分。 在通过MSDN挖掘后,我发现此链接很有用 。

  public List GetCodeReviewComments(int workItemId) { List comments = new List(); Uri uri = new Uri(URL_TO_TFS_COLLECTION); TeamFoundationDiscussionService service = new TeamFoundationDiscussionService(); service.Initialize(new Microsoft.TeamFoundation.Client.TfsTeamProjectCollection(uri)); IDiscussionManager discussionManager = service.CreateDiscussionManager(); IAsyncResult result = discussionManager.BeginQueryByCodeReviewRequest(workItemId, QueryStoreOptions.ServerAndLocal, new AsyncCallback(CallCompletedCallback), null); var output = discussionManager.EndQueryByCodeReviewRequest(result); foreach (DiscussionThread thread in output) { if (thread.RootComment != null) { CodeReviewComment comment = new CodeReviewComment(); comment.Author = thread.RootComment.Author.DisplayName; comment.Comment = thread.RootComment.Content; comment.PublishDate = thread.RootComment.PublishedDate.ToShortDateString(); comment.ItemName = thread.ItemPath; comments.Add(comment); } } return comments; } static void CallCompletedCallback(IAsyncResult result) { // Handle error conditions here } public class CodeReviewComment { public string Author { get; set; } public string Comment { get; set; } public string PublishDate { get; set; } public string ItemName { get; set; } }