Как использовать ключевое слово LIMIT как в MS SQL для WIQL для запроса TFS workItem

Я работаю над TFS API, я не знаю, есть ли у TFS API какие-либо вещи, например ключевое слово LIMIT или нет. Мне это нужно для подкачки страниц.

Спасибо

2 ответа

Решение

Нет ничего эквивалентного SQL LIMIT Ключевое слово в TFS WIQL, вам нужно будет реализовать пейджинг самостоятельно.

Один из подходов состоит в том, чтобы получить все результаты при первом доступе, а также кэшировать их и размещать на страницах самостоятельно.

Другим подходом было бы динамическое построение запроса WIQL каждый раз, когда ваши пользовательские страницы. Например:

  1. Запустите WIQL-запрос, чтобы получить только идентификаторы рабочих элементов, соответствующие запросу. SELECT [System.Id] FROM WorkItems WHERE <conditions>
  2. Кэшируйте этот список идентификаторов
  3. Разбейте этот список идентификаторов на группы, соответствующие размеру вашего подкачки
  4. Каждый раз, когда ваши пользовательские страницы явно запрашивают идентификатор рабочего элемента. SELECT <fields> FROM WorkItems WHERE [System.Id] IN (10,11,12,13,14,15)

В зависимости от того, чего вы пытаетесь достичь, вы также должны знать, что API-интерфейс отслеживания рабочих элементов TFS реализует загрузку страниц / отложенную загрузку под полями для значений полей, чтобы максимизировать время отклика. Чтобы увидеть, как это работает, подключите сетевой анализатор и прокрутите большой запрос рабочего элемента в Visual Studio.

См. Пейджинг значений полей для получения дополнительной информации:

Вы можете минимизировать количество обращений к серверу, выбрав все поля, которые будет использовать ваш код. Следующий код выполняет одно и то же обращение для запроса и одно - для возврата страницы заголовков при каждом обращении к новой странице.

WorkItemCollection results = WorkItemStore.Query(
    "SELECT Title FROM Workitems WHERE (ID < 1000)");

foreach (WorkItem item in results)
{
    Console.WriteLine(item.Fields["Title"].Value);
}

Если ваш код обращается к полю, которое вы не указали в предложении SELECT, это поле добавляется к набору постраничных полей. Выполняется еще один круговой обход, чтобы обновить эту страницу и включить значения этого поля.

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

Me.mWorkItems.Query(pstrSQL).OfType(Of WorkItem)().Take(5)

С помощью Skip а также Take вместе могли бы работать на пейджинг.

Другие вопросы по тегам