TFS API - 如何从特定的团队项目中获取工作项

38

我正在尝试查询主要的TfsTeamProjectCollection中的单个团队项目,该集合总共包含194个团队项目。我知道如何从WorkItemStore根据ID获取WorkItem。问题是,通过这样做,API会在集合中的所有项目中搜索,并且查询需要大约一分钟的时间。这太慢了,必须有一种直接从单个团队项目查询工作项的方法。以下是我的代码:

    private Uri collectionUri;
    private TfsTeamProjectCollection projectCollection;
    private WorkItemStore workItemStore;

    public Project GetTeamProject()
    {
        projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(collectionUri);

        workItemStore = projectCollection.GetService<WorkItemStore>();
        Project teamProject = workItemStore.Projects[TFS_PROJECT_KEY];
        return teamProject;
    }

现在我已经有了我感兴趣的团队项目,我该如何按 ID 查询工作项或者获取该项目中的所有工作项?


顺便说一下,去掉那个try/catch块。它没有任何作用。 - John Saunders
以前会抛出NullPointerException,因为该方法需要一个项目ID作为参数,但我已经更改了它。 - Jean-François Beaulieu
1
你所做的只是重新抛出异常,这与根本不捕获异常是一样的。而且你也永远不应该捕获NullReferenceException,因为它总是表示编程错误。 - John Saunders
7
感谢指引,但这有点超出讨论范围。 - Jean-François Beaulieu
2个回答

35
你可以尝试像这样获取所有teamProject中的WIs:
WorkItemCollection workItemCollection = workItemStore.Query(
     " SELECT [System.Id], [System.WorkItemType],"+    
     " [System.State], [System.AssignedTo], [System.Title] "+ 
     " FROM WorkItems " +
     " WHERE [System.TeamProject] = '" + teamProject.Name +
    "' ORDER BY [System.WorkItemType], [System.Id]");

使用以下代码来获取特定的WorkItem ID:

WorkItem workItem = workItemStore.GetWorkItem(555);

你知道在项目中添加哪个引用才能识别查询吗?因为我已经使用了 Microsoft.TeamFoundation.ClientMicrosoft.TeamFoundation.WorkItemTracking.Client,但是在 workItemStore.Query() 的参数中出现了错误。 - Jean-François Beaulieu
6
请注意,就像使用 SQL 查询一样,您可以使用“@ParameterName”在团队查询中添加参数。只需将字典作为最后一个参数添加,包含名称/值对,WorkItemStore 将确保数据被正确转义。(请参见: http://msdn.microsoft.com/en-US/library/bb140400(v=vs.80).aspx) - jessehouwing
我只是随便提一下,如果你想要一个特定的工作项,你必须像这样进行过滤:"AND [System.Id] = " + workItemID; - 这在上面没有明确说明,没关系。 - dyslexicanaboko

15

为了提高效率,使用查询来查找你感兴趣的工作项可能是最有效的。你可以在查询中添加 Where project = '@Project' 来限制范围仅限于该项目。通过先调用 BeginQuery 然后再调用 EndQuery,你将获得一个仅包含你要查找的工作项的集合。

获取所需的 WQL 查询最简单的方法是在 Team Explorer 中创建一个查询,然后使用文件 -> 另存为(在编辑模式下)将其保存到文件中。在记事本中打开该文件以复制查询。

或者,你可以直接使用WorkItemStore.Query 方法来实现相同的效果。


3
保存WQL查询是一个很棒的技巧。使用Team Explorer GUI更容易获得正确的查询。你节省了我数小时的麻烦 :-) - DaveF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接