How to retrieve list of child tasks from a Product Backlog Item in TFS API?

10,948

As a standard, team project in MSF Agile comes with a set of queries. Take a look at 'Work Items' -> 'Iteration 1' -> 'Iteration Backlog'.

Saving this query as WIQL file in your disk is absolutely possible.
Using it as a modified wiqlQuery should relieve you from a lot of the filtering you do.

EDIT (in response to comment: "Ok, I did that, but the query doesn't mention the relationship between parent and linked (child) items"):

I opened the WIQL of a default "Iteration Backlog":

<?xml version="1.0" encoding="utf-8"?>
<WorkItemQuery Version="1">
  <TeamFoundationServer>
  http://****>
  <TeamProject>****</TeamProject>
  <Wiql>SELECT [System.Id], [System.WorkItemType], [System.Title],
  [System.State], [System.AssignedTo],
  [Microsoft.VSTS.Scheduling.RemainingWork],
  [Microsoft.VSTS.Scheduling.CompletedWork],
  [Microsoft.VSTS.Scheduling.StoryPoints],
  [Microsoft.VSTS.Common.StackRank],
  [Microsoft.VSTS.Common.Priority],
  [Microsoft.VSTS.Common.Activity], [System.IterationPath],
  [System.AreaPath] FROM WorkItemLinks WHERE
  (Source.[System.TeamProject] = @project and
  Source.[System.AreaPath] under @project and
  Source.[System.IterationPath] under '****\Iteration 1' and
  (Source.[System.WorkItemType] = 'User Story' or
  Source.[System.WorkItemType] = 'Task')) and
  [System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward'
  and Target.[System.WorkItemType] = 'Task' ORDER BY
  [Microsoft.VSTS.Common.StackRank],
  [Microsoft.VSTS.Common.Priority] mode(Recursive)</Wiql>
</WorkItemQuery>

The part of the query that retrieves the related items should be this

[System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward'
Share:
10,948
Padu Merloti
Author by

Padu Merloti

Curious learner. Family lover. Air faller. Robot maker. Software developer.

Updated on June 18, 2022

Comments

  • Padu Merloti
    Padu Merloti almost 2 years

    Given a certain product backlog id, I want to programmatically retrieve a list of tasks that are child to the PBI.

    I am aware that there's not one field in the task that says "Parent PBI Id". I have a version of code that is working, but that's really really slow, since I have do perform part of my filtering int the client.

    See how I'm currently doing:

    string wiqlQuery =
        string.Format(
            "Select ID, [Remaining Work], State " +
            "from WorkItems " +
            "where (([Work Item Type] = 'Task')" +
            " AND ([Iteration Path] = '{0}' )" +
            " AND (State <> 'Removed')" +
            " AND (State <> 'Done')) ",
            sprint, storyId);
    
    // execute the query and retrieve a collection of workitems
    WorkItemCollection workItems = wiStore.Query(wiqlQuery);
    
    if (workItems.Count <= 0)
        return null;
    
    var result = new List<TaskViewModel>();
    foreach (WorkItem workItem in workItems)
    {
        var relatedLink = workItem.Links[0] as RelatedLink;
        if (relatedLink == null) continue;
        if (relatedLink.RelatedWorkItemId != storyId) continue;
    
        Field remWorkField = (from field in workItem.Fields.Cast<Field>()
                              where field.Name == "Remaining Work"
                              select field).FirstOrDefault();
        if (remWorkField == null) continue;
        if (remWorkField.Value == null) continue;
    
        var task = new TaskViewModel
        {
            Id = workItem.Id,
            ParentPbi = relatedLink.RelatedWorkItemId,
            RemainingWork = (double) remWorkField.Value,
            State = workItem.State
        };
    
        result.Add(task);
    }
    
    return result;
    
  • Padu Merloti
    Padu Merloti over 12 years
    I'm using the Scrum template, but I think I know what you're talking about. In my case I have a "Sprint Backlog" query that does what I want, but I don't see any way to save it to disk or how to see the string query that is being used. It is a query of type "Tree of Work Items"
  • pantelif
    pantelif over 12 years
    I myself wasn't aware of this as well, and caught it in this thread stackoverflow.com/questions/6534060/…. Once you have saved the file you can open it in any editor and copy the WIQL query in your C#
  • Padu Merloti
    Padu Merloti over 12 years
    Ok, I did that, but the query doesn't mention the relationship between parent and linked (child) items
  • Admin
    Admin about 6 years
    i can't find LinkType in he fields col. @PaduMerloti
  • Admin
    Admin about 6 years
    @pantelif can't find LinkType