2011-10-05 36 views
7

鉴于某个产品积压ID,我想以编程方式检索PBI的子任务列表。如何从TFS API中的产品Backlog项检索子任务列表?

我知道任务中没有一个字段显示“Parent PBI Id”。我有一个正在工作的代码版本,但这真的很慢,因为我已经在客户端执行了部分过滤。

看到我如何目前做:

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; 
+0

有你试图在查询生成器gui中构建查询?如果你可以做到这一点,然后将查询保存为一个文件,该文件将包含一个很好的wiql语句。如果您可以在wiql中执行查询,它将转换为后端的单个sql查询,而不是在客户端api上执行。 – bryanmac

+0

只要方法接受谓词,您可以使用'workItem.Fields.Cast ().FirstOrDefault(f => field.Name ==“Remaining Work”)''。目前你使用'Where(..)。FirstOrDefault()',这是压倒性的。 – abatishchev

+0

wistore是什么? –

回答

2

作为标准,在无国界医生敏捷团队项目提供了一组查询。看看'工作项目' - >'Iteration 1' - >'迭代积压'。

将此查询保存为磁盘中的WIQL文件是绝对有可能的。
使用它作为修改的wiqlQuery应该可以让您免除大量的过滤。

编辑(响应发表评论:“好好好,我这样做,但查询没有提到父母和链接(子项)之间的关系”):

我开的WIQL一个默认的“迭代积压”:

<?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> 

检索相关项目查询的部分应该是这个

[System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward' 
+0

我使用Scrum模板,但我想我知道你在说什么。在我的情况下,我有一个“Sprint Backlog”查询,但是我没有看到任何将其保存到磁盘或查看正在使用的字符串查询的方法。这类型的查询“工作项目之树” –

+0

我自己是没有意识到这一点为好,并在此线程抓住它http://stackoverflow.com/questions/6534060/how-to-export-bug-列表或-任何定制查询,从-TFS到Excel-从-A-命令霖/ 6541934#6541934。一旦你已经保存的文件,你可以在任何编辑器中打开它,并复制WIQL查询在C# – pantelif

+0

好吧,我这样做,但查询没有提到父母和链接(子项)之间的关系 –

相关问题