How can I retrieve a list of workitems from TFS in C#?

21,948

You need to use WIQL queries to get actual work items you are interested in, e.g. to get all work items for a particular project:

using Microsoft.TeamFoundation.WorkItemTracking.Client;

Query query = new Query(
     workItemStore, 
     "select * from issue where System.TeamProject = @project",
     new Dictionary<string, string>() { { "project", project.Name } }
);

var workItemCollection = query.RunQuery();
foreach(Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem workItem in workItemCollection) 
{
   /*Get work item properties you are interested in*/
   foreach(Microsoft.TeamFoundation.WorkItemTracking.Client.Field field in workItem.Fields)
   {
      /*Get field value*/
      info += String.Format("Field name: {0} Value: {1}\n", field.Name, field.Value);
   }
}
Share:
21,948
Nightmare Games
Author by

Nightmare Games

Developer of strange video games and other tech, Nightmare Games lives at BurningFreak.com and is always hard at work on its next interactive audio-visual sensory onslaught. We currently operate out of the greater Seattle area with part-time help from our partners in Pennsylvania and Iowa. Completed Projects: Photon (C++ 2D Graphics Engine) Outlaw JS (Javascript 2D Game Engine) Ultraguy (Browser Game) Wobbly Piss (Browser Game) Blockhead (Xbox 360 / Windows / WP7 Game) Current Projects: H0V3R (C# Unity Game) Super Krampus (C++ Windows Game) Blockhead (Javascript Browser Game) Engineer (MVC Browser Game) Boxland Incorporated (C# Windows Game)

Updated on November 10, 2021

Comments

  • Nightmare Games
    Nightmare Games over 2 years

    I'm trying to write a project reporting tool in WPF / C#. I want to access all the project names on our TFS (Team Foundation Server), and then display statistics for each work item in a given project.

    I've got the project names, but getting the actual work items is what's giving me a hard time. Here's what I've got so far:

    public const string tfsLocation = "http://whatever";
    
    // get the top list of project names from the team foundation server
    public List<string> LoadProjectList()
    {
        var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsLocation));
        var workItemStore = new WorkItemStore(tpc);
        var projects = (from Project project in workItemStore.Projects select project.Name).ToList();
    
        return projects;
    }
    
    public string GetProjectInfo(string targetProject)
    {
        string info = String.Empty;
    
        var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsLocation));
        var workItemStore = new WorkItemStore(tpc);
    
        foreach (Project project in workItemStore.Projects)
        {
            if (project.Name == targetProject)
            {
                info += String.Format("Project: {0}\n\n", project.Name);
    
                info += "Work Item Types:\n";
                foreach (WorkItemType item in project.WorkItemTypes)
                {
                    info += String.Format("-   {0}\n", item.Name);
                    info += String.Format("    -   Description: {0}\n", item.Description);
                    info +=               "    -   Field Definitions:\n";
    
                    foreach (FieldDefinition field in item.FieldDefinitions)
                    {
                        info += String.Format("        -   {0}\n", field.Name);
                    }
                    info += "\n";
                }
            }
        }
    
        return info;
    }
    

    GetProjectInfo sends back some helpful info about what's in each project, but so far it looks like I'm only seeing the definitions of what the WorkItems consist of, and not the actual WorkItems themselves. I think the programming I've written is looking in the wrong place.

    From Microsoft's definition of WorkItem, (http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.workitemtracking.client.workitem.aspx) it looks like it's inside WorkItemTracking.Client, but not inside the WorkItemStore, and I'm not sure where to go to access it.

    FINAL VERSION:

    Here's the updated version of my function, after referencing the below answer. This just returns a long string of the work item names with new lines between, for printing out, which is all I'm trying to get working (for now).

    public string GetProjectInfo(string targetProject)
    {
        string info = String.Empty;
    
        var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsLocation));
        WorkItemStore workItemStore = new WorkItemStore(tpc);
    
        Query query = new Query(workItemStore, "SELECT * FROM WorkItems WHERE [System.TeamProject] = @project", new Dictionary<string, string>() { { "project", targetProject } });
    
        WorkItemCollection wic = query.RunQuery();
    
        foreach (WorkItem item in wic)
        {
            info += String.Format("{0}\n", item.Title);
        }
    
        return info;
    }