public void GetWorkItems() { JsonPatchDocument patchDocument = new JsonPatchDocument { new JsonPatchOperation() { Operation = Operation.Add, Path = "/fields/System.Title", Value = "2nd Work Item Created Using REST Client" } }; WorkItem wi = WitClient.CreateWorkItemAsync(patchDocument, TeamProject.Name, DefaultWorkItemType.Name).Result; WorkItemsAdded.Add(wi.Id.Value); // GetWorkItemsAsync can only return 200 items at a time, so only take the first 200 of the work items list. // Larger lists will require batching calls to GetWorkItemsAsync until the list is processed. List <WorkItem> workItems = WitClient.GetWorkItemsAsync(WorkItemsAdded.Take(200)).Result; foreach (var workItem in workItems) { Console.WriteLine($"{workItem.Id}: '{workItem.Fields["System.Title"]}'"); } Console.WriteLine(); }
/// <summary> /// Finds the parent hierarchy. /// </summary> /// <param name="workItem">The work item.</param> /// <param name="parents">The parents.</param> /// <autogeneratedoc/> private async Task FindParentHierarchy(WorkItem workItem, List <string> parents) { var parentRelType = (parentRelationType ?? await GetParentRelationType()).ReferenceName; var parentIds = GetLinkedWorkItemIds(workItem, parentRelType); if (!parentIds.Any()) { return; } var wis = await WitClient.GetWorkItemsAsync(parentIds, null, null, WorkItemExpand.All); var parent = wis .Where( p => p.Fields.ContainsKey(WorkItemFieldType.Title) && p.Fields.ContainsKey(WorkItemFieldType.WorkItemType) && !string.IsNullOrWhiteSpace(p.Fields[WorkItemFieldType.WorkItemType] as string) && (p.Fields[WorkItemFieldType.WorkItemType] as string == WorkItemType.Epic || p.Fields[WorkItemFieldType.WorkItemType] as string == WorkItemType.Feature)) .FirstOrDefault(); if (parent != null) { parents.Add((string)parent.Fields[WorkItemFieldType.Title]); await FindParentHierarchy(parent, parents); } }
/// <summary> /// Adds the effort values. /// </summary> /// <param name="record">The record.</param> /// <param name="workItem">The work item.</param> /// <returns>Task.</returns> /// <exception cref="VssResourceNotFoundException">Query not found : " + queryName.</exception> private async Task AddEffortValues(List <object?> record, WorkItem workItem) { var childRelType = (childRelationType ?? await GetChildRelationType()).ReferenceName; var fieldNames = GetTaskFieldReferenceNames(); var linkedWi = GetLinkedWorkItemIds(workItem, childRelType); if (linkedWi.Count > 0) { var wis = await WitClient.GetWorkItemsAsync(linkedWi, null, null, WorkItemExpand.Fields); var tasks = wis .Where(p => p.Fields.ContainsKey(WorkItemFieldType.Activity) && p.Fields.ContainsKey(WorkItemFieldType.WorkItemType) && p.Fields[WorkItemFieldType.WorkItemType] as string == WorkItemType.Task) .Select(p => new Effort { Activity = p.Fields[WorkItemFieldType.Activity] as string ?? string.Empty, OriginalEstimate = p.Fields.ContainsKey(WorkItemFieldType.OriginalEstimate) ? p.Fields[WorkItemFieldType.OriginalEstimate] as double? ?? 0 : 0, RemainingWork = p.Fields.ContainsKey(WorkItemFieldType.RemainingWork) ? p.Fields[WorkItemFieldType.RemainingWork] as double? ?? 0 : 0, CompletedWork = p.Fields.ContainsKey(WorkItemFieldType.CompletedWork) ? p.Fields[WorkItemFieldType.CompletedWork] as double? ?? 0 : 0, }) .GroupBy(p => p.Activity) .Select(p => new Effort { Activity = p.Key, OriginalEstimate = p.Sum(q => q.OriginalEstimate), RemainingWork = p.Sum(q => q.RemainingWork), CompletedWork = p.Sum(q => q.CompletedWork), }) .ToList(); record.AddRange(new object[] { tasks.Sum(p => p.OriginalEstimate), tasks.Sum(p => p.RemainingWork), tasks.Sum(p => p.CompletedWork) }); foreach (var activity in (activityCollection ?? await GetOrderedActivityList()).Activities) { var query = tasks.Where(p => p.Activity == activity); if (query.Any()) { var effort = query.Single(); record.AddRange(new object[] { effort.OriginalEstimate, effort.RemainingWork, effort.CompletedWork }); } else { record.AddRange(new object[] { 0, 0, 0 }); } } } else { record.AddRange(new object[] { 0, 0, 0 }); foreach (var activity in (activityCollection ?? await GetOrderedActivityList()).Activities) { record.AddRange(new object[] { 0, 0, 0 }); } } }
public void QueryById() { // Get an existing query and associated ID for proof of concept. // Get the root query folders var queries = WitClient.GetQueriesAsync(TeamProject.Name, null, 1).Result; var myQueriesFolder = queries.Where(q => !q.IsPublic.Value).FirstOrDefault(); if (myQueriesFolder != null && myQueriesFolder.IsFolder.GetValueOrDefault(false) && myQueriesFolder.HasChildren.GetValueOrDefault(false)) { var firstQuery = myQueriesFolder.Children.First(); // Query by ID and process results var queryResults = WitClient.QueryByIdAsync(firstQuery.Id).Result; Console.WriteLine($"Query with name: '{firstQuery.Name}' and id: '{firstQuery.Id}' returned {queryResults.WorkItems.Count()} results:"); if (queryResults.WorkItems.Count() > 0) { // GetWorkItemsAsync can only return 200 items at a time, so only take the first 200 of the work items list. // Larger lists will require batching calls to GetWorkItemsAsync until the list is processed. var workItemList = queryResults.WorkItems.Select(wi => wi.Id).Take(200); string[] fields = new string[] { "System.Id", "System.Title" }; var workItems = WitClient.GetWorkItemsAsync(workItemList, fields).Result; foreach (WorkItem wi in workItems) { Console.WriteLine($"WorkItem Id: '{wi.Id}' Title: '{wi.Fields["System.Title"]}'"); } } else { Console.WriteLine($"Query with name: '{firstQuery.Name}' and id: '{firstQuery.Id}' did not return any results."); Console.WriteLine($"Try assigning work items to yourself or following work items and run the sample again."); } Console.WriteLine(); } else { Console.WriteLine("My Queries haven't been populated yet. Open up the Queries page in the browser to populate these, and then run the sample again."); } }
public void QueryByWiql() { Wiql wiql = new Wiql() { Query = $"Select [System.Id], [System.Title], [System.State] From WorkItems Where [System.WorkItemType] = '{DefaultWorkItemType.Name}' and [System.TeamProject] = '{TeamProject.Name}'" }; var queryResults = WitClient.QueryByWiqlAsync(wiql).Result; Console.WriteLine($"The wiql query returned {queryResults.WorkItems.Count()} results:"); var workItemList = queryResults.WorkItems.Select(wi => wi.Id); string[] fields = new string[] { "System.Id", "System.Title" }; var workItems = WitClient.GetWorkItemsAsync(workItemList, fields).Result; foreach (WorkItem wi in workItems) { Console.WriteLine($"WorkItem Id: '{wi.Id}' Title: '{wi.Fields["System.Title"]}'"); } Console.WriteLine(); }