private static int CompareWorkItemByDate(NtWorkItem x, NtWorkItem y) { if (x == null) { if (y == null) { // If x is null and y is null, they're // equal. return(0); } else { // If x is null and y is not null, y // is greater. return(-1); } } else { // If x is not null... // if (y == null) // ...and y is null, x is greater. { return(1); } else { var xDate = DateTime.Parse(x.ClosedDate); var yDate = DateTime.Parse(y.ClosedDate); return(xDate.CompareTo(yDate)); } } }
private static List <NtWorkItem> GetNtWorkItems(IEnumerable <WorkItemLink> workItemLinks, WorkItemTrackingHttpClientBase witClient, WorkItemQueryResult workItemQueryResult, string teamProjectName, IReadOnlyCollection <TeamSettingsIteration> iterations, DateTime starDate, DateTime endDate) { var fields = FIELDS; var allIds = new List <int>(); var epicIds = new List <int>(); var miscParentTag = new Dictionary <int, string>(); var reverseIdDict = new Dictionary <int, bool>(); var idDict = new Dictionary <int, int?>(); var categoryDict = new Dictionary <int, string>(); foreach (var workItemLink in workItemLinks) { allIds.Add(workItemLink.Target.Id); if (!workItemLink.Rel.IsNullOrEmpty()) { reverseIdDict[workItemLink.Source.Id] = true; idDict[workItemLink.Target.Id] = workItemLink.Source.Id; continue; } idDict.Add(workItemLink.Target.Id, null); epicIds.Add(workItemLink.Target.Id); } var epicWorkItems = witClient.GetWorkItemsAsync(epicIds, fields, workItemQueryResult.AsOf).Result; foreach (var epicWorkItem in epicWorkItems) { var id = int.Parse(epicWorkItem.Fields["System.Id"].ToString()); var title = "MISC"; var tags = epicWorkItem.Fields.ContainsKey("System.Tags") ? epicWorkItem.Fields["System.Tags"]?.ToString().Trim() : string.Empty; if (epicWorkItem.Fields["System.WorkItemType"].ToString().ToLower().Equals("epic")) { title = epicWorkItem.Fields["System.Title"].ToString(); } else if (!string.IsNullOrEmpty(tags)) { if (tags == NtInsight) { title = NtInsight; } miscParentTag.Add(id, tags); } categoryDict.Add(id, title); } var taskIds = new List <int>(); foreach (var id in allIds) { if (reverseIdDict.ContainsKey(id)) { continue; } taskIds.Add(id); var refId = id; while (idDict[refId].HasValue) { refId = idDict[refId].Value; } categoryDict[id] = categoryDict[refId]; if (!miscParentTag.ContainsKey(refId)) { continue; } miscParentTag[id] = miscParentTag[refId]; } var skip = 0; const int take = 100; var ntWorkItems = new List <NtWorkItem>(); int[] curTaskIds; do { curTaskIds = taskIds.Skip(skip).Take(take).ToArray(); if (curTaskIds.Length == 0) { break; } var taskWorkItems = witClient.GetWorkItemsAsync(curTaskIds, fields, workItemQueryResult.AsOf).Result; foreach (var taskWorkItem in taskWorkItems) { var id = int.Parse(taskWorkItem.Fields["System.Id"].ToString()); string workItemType = null; if (taskWorkItem.Fields.ContainsKey("System.WorkItemType")) { workItemType = taskWorkItem.Fields["System.WorkItemType"].ToString(); } string activity = null; if (taskWorkItem.Fields.ContainsKey("Microsoft.VSTS.Common.Activity")) { activity = taskWorkItem.Fields["Microsoft.VSTS.Common.Activity"].ToString(); } var title = taskWorkItem.Fields["System.Title"].ToString(); string assignedTo = null; if (taskWorkItem.Fields.ContainsKey("System.AssignedTo")) { assignedTo = taskWorkItem.Fields["System.AssignedTo"].ToString(); } var state = taskWorkItem.Fields["System.State"].ToString(); string closedDateString = null; DateTime?closedDate = null; if (taskWorkItem.Fields.ContainsKey("Microsoft.VSTS.Common.ClosedDate")) { closedDate = DateTime.Parse(taskWorkItem.Fields["Microsoft.VSTS.Common.ClosedDate"].ToString()); closedDateString = closedDate.Value.ToString("yyyy MMMM dd"); } string iterationPath = null; if (taskWorkItem.Fields.ContainsKey("System.IterationPath")) { iterationPath = taskWorkItem.Fields["System.IterationPath"].ToString(); var iteration = iterations .FirstOrDefault(i => i.Path.Trim().Equals(iterationPath.Trim())); if (closedDate.HasValue && iteration?.Attributes.StartDate != null && iteration.Attributes.FinishDate.HasValue) { if (closedDate.Value.CompareTo(iteration.Attributes.StartDate) >= 0 && closedDate.Value.CompareTo(iteration.Attributes.FinishDate) <= 0) { //correct case } else { closedDate = iteration.Attributes.FinishDate; } closedDateString = closedDate.Value.ToString("yyyy MMMM dd"); } } string areaPath = null; if (taskWorkItem.Fields.ContainsKey("System.AreaPath")) { areaPath = taskWorkItem.Fields["System.AreaPath"].ToString(); } double?duration = null; if (taskWorkItem.Fields.ContainsKey("Nt.Duration")) { duration = double.Parse(taskWorkItem.Fields["Nt.Duration"].ToString()); } var product = categoryDict[id]; var ntWorkItem = new NtWorkItem { Id = id, WorkItemType = workItemType, Activity = activity, Title = title, AssignedTo = assignedTo, State = state, IterationPath = iterationPath, ClosedDate = closedDateString, AreaPath = areaPath, Duration = duration, Product = product, TeamProject = teamProjectName, ParentTags = miscParentTag.ContainsKey(id) ? miscParentTag[id] : string.Empty }; ntWorkItems.Add(ntWorkItem); } skip += take; } while (curTaskIds.Count() == take); return(ntWorkItems); }