Как отобразить результаты из TFS WorkItemTrackingHttpClient QueryByWiqlAsync - PullRequest
0 голосов
/ 20 января 2020

Я использую WorkItemTrackingHttpClient.QueryByWiqlAsyn c, чтобы получить результаты запроса. По умолчанию возвращает лучшие 200 записей. Он имеет верхний параметр, который можно использовать для указания значения меньше 200.

Однако результат моего запроса превышает 200 записей. Кто-нибудь знает, как выполнить запрос с помощью клиента TFS с правильной страницей .ie страницы и размером страницы? Например, верните страницу 10, где количество страниц, скажем, 50.

Я осмотрелся, но не вижу, как это сделать с помощью клиента, что удивительно, так как возможности кажутся такими фундаментальными.

Я использую пакет Nuget Microsoft.TeamFoundationServer.Client 16.153.0. Я также подключаюсь к TFS 2017 onprem.

1 Ответ

0 голосов
/ 20 января 2020

Да, мы можем только вернуть список рабочих элементов, который ограничивается максимум 200, вызвав API. Это сделано специально, см. Рабочие элементы - список . Подробнее

Однако мы можем использовать WIQL-запросы для извлечения данных из Azure DevOps. Он очень гибкий и может использоваться в любой ситуации. См. WIQL-запросы и Azure DevOps Rest API для WIQL-запросов

Чтобы получить все рабочие элементы, мы можем попробовать выполнить следующие шаги:

  1. Выполнение сохраненного запроса с использованием API запросов рабочих элементов для получения списка идентификаторов рабочих элементов
  2. Разделение списка идентификаторов рабочих элементов на группы по 200 , что является максимальной партией размер, который поддерживает API рабочих элементов
  3. Вызовите API рабочих элементов для каждого списка из 200 идентификаторов рабочих элементов, чтобы получить сведения о рабочем элементе.

Вы можете сослаться на эту тему для деталей.

Кроме того, ниже код для вашей справки, это работает для меня:

using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.Common;
using System;
using System.Collections.Generic;
using System.Linq;

namespace QueryWorkitems0619
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://tfs2017:8080/tfs/DefaultCollection");

            //string PAT = "xxxx";
            string project = "SCRUM-TFVC";

            //VssBasicCredential credentials = new VssBasicCredential(user, PAT);

            VssCredentials credentials = new VssClientCredentials();
            credentials.Storage = new VssClientCredentialStorage();

        //create a wiql object and build our query
        Wiql wiql = new Wiql()
        {
            Query = "Select * " +
                    "From WorkItems " +
                    "Where [Work Item Type] = 'Product Backlog Item' " +
                    "And [System.TeamProject] = '" + project + "' " +
                    "And [System.State] <> 'Closed' " +
                    "Order By [State] Asc, [Changed Date] Desc"
        };

        //create instance of work item tracking http client
        using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(uri, credentials))
        {
            //execute the query to get the list of work items in the results
            WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByWiqlAsync(wiql).Result;

            //Splict the query result (the list of work item IDs) into groups of 200.
            var QueryGroups = from i in Enumerable.Range(0, workItemQueryResult.WorkItems.Count())
                            group workItemQueryResult.WorkItems.ToList()[i] by i / 200;

            foreach (var QueryGroup in QueryGroups)
            {
                //some error handling                
                if (QueryGroup.Count() != 0)
                {
                    //need to get the list of our work item ids and put them into an array
                    List<int> list = new List<int>();
                    foreach (var item in QueryGroup.ToList())
                    {
                        list.Add(item.Id);
                    }
                    int[] arr = list.ToArray();

                    //build a list of the fields we want to see
                    string[] fields = new string[3];
                    fields[0] = "System.Id";
                    fields[1] = "System.Title";
                    fields[2] = "System.State";

                    //get work items for the ids found in query
                    var workItems = workItemTrackingHttpClient.GetWorkItemsAsync(arr, fields, workItemQueryResult.AsOf).Result;

                    Console.WriteLine("\n\n----------------------------------------------------------------");
                    Console.WriteLine("\nQuery Results: {0} items found for Group {1}", workItems.Count, QueryGroup.Key);
                    Console.WriteLine("\n----------------------------------------------------------------");

                    //loop though work items and write to console
                    foreach (var workItem in workItems)
                    {
                        Console.WriteLine("ID:{0} Title:{1}  State:{2}", workItem.Id, workItem.Fields["System.Title"], workItem.Fields["System.State"]);
                    }         
                }                 
            }
            Console.ReadLine();
        }
    }
}

}

enter image description here

...