You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过C#调用TFS API获取工作项讨论评论及相关日期

解决TFS工作项评论及日期获取问题

我来帮你搞定这个TFS工作项评论的获取需求!你之前遍历Revisions的方式会拿到所有工作项的变更记录(包括附件、字段修改这些),这就是为什么会出现无关日期的原因。咱们直接用Microsoft.TeamFoundation.Discussion.Client来精准获取评论内容和对应的日期,步骤如下:

1. 核心思路

TFS的评论是存储在**讨论线程(DiscussionThread)**里的,每个线程包含多条评论,每条评论都有明确的创建日期。我们需要:

  • 初始化讨论管理器(DiscussionManager)连接到TFS服务器
  • 根据工作项ID获取对应的讨论线程集合
  • 遍历所有评论,提取内容、创建日期,同时记录最早和最新的评论日期

2. 完整代码示例

首先确保你已经引用了Microsoft.TeamFoundation.ClientMicrosoft.TeamFoundation.Discussion.Client程序集,然后用以下代码:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Discussion.Client;
using System;
using System.Collections.Generic;
using System.Linq;

// 初始化TFS服务器连接
Uri tfsUri = new Uri("http://你的TFS服务器地址:8080/tfs/集合名称");
TfsTeamProjectCollection tfsCollection = new TfsTeamProjectCollection(tfsUri);
tfsCollection.EnsureAuthenticated();

// 获取DiscussionManager
DiscussionManager discussionManager = tfsCollection.GetService<DiscussionManager>();

// 指定要查询的工作项ID
int workItemId = 12345; // 替换成你的工作项ID

// 获取该工作项的所有讨论线程
IEnumerable<DiscussionThread> threads = discussionManager.GetDiscussionsByArtifactUris(
    new[] { new Uri($"vstfs:///WorkItem/WorkItem/{workItemId}") },
    QueryStoreOptions.ServerAndLocal);

// 存储所有评论信息的列表
List<(string CommentContent, DateTime CreatedDate)> commentsList = new List<(string, DateTime)>();

foreach (var thread in threads)
{
    // 遍历线程里的每条评论
    foreach (var comment in thread.Comments)
    {
        // 提取评论内容和创建日期
        commentsList.Add((comment.Content, comment.CreatedDate));
        Console.WriteLine($"评论内容: {comment.Content}");
        Console.WriteLine("创建日期: {0:yyyy-MM-dd HH:mm:ss}", comment.CreatedDate);
        Console.WriteLine("---");
    }
}

// 获取最早和最晚的评论日期
if (commentsList.Any())
{
    DateTime earliestDate = commentsList.Min(c => c.CreatedDate);
    DateTime latestDate = commentsList.Max(c => c.CreatedDate);
    Console.WriteLine($"最早评论日期: {earliestDate:yyyy-MM-dd HH:mm:ss}");
    Console.WriteLine($"最新评论日期: {latestDate:yyyy-MM-dd HH:mm:ss}");

    // 这里可以添加将数据存入数据库的逻辑
    // 比如用ADO.NET或者EF Core,把commentsList、earliestDate、latestDate写入对应的表
}
else
{
    Console.WriteLine("该工作项没有评论");
}

3. 关键说明

  • 为什么不用Revisions?WorkItem.Revisions包含了工作项的所有变更操作(比如字段修改、附件添加、状态变更等),而评论是独立的讨论实体,通过Discussion API才能精准获取。
  • 评论的日期:每条CommentCreatedDate就是评论添加的时间,直接用这个字段就可以,不需要从Revisions里筛选。
  • 存入数据库:拿到commentsListearliestDatelatestDate后,你可以用熟悉的数据库操作方式(比如SqlConnection执行插入语句,或者EF Core的Add方法)把数据写入对应的表中。

4. 可能遇到的问题

  • 如果运行时提示权限不足,确保你的TFS账号有访问该工作项讨论的权限。
  • 如果找不到DiscussionManager,检查是否正确引用了Microsoft.TeamFoundation.Discussion.Client程序集(可以从NuGet安装对应的包)。

内容的提问来源于stack exchange,提问作者Vasuki Hebbar

火山引擎 最新活动