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();
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <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();
        }