2011-10-05 40 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

好吧,我這樣做,但查詢沒有提到父母和鏈接(子項)之間的關係 –

相關問題