Как использовать ключевое слово LIMIT, используемое в ms sql с помощью WIQL, для запроса рабочего элемента TFS

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

Спасибо


person knowwebapp.com beautiful-theme    schedule 11.01.2013    source источник
comment
Можете ли вы объяснить, что вы пытаетесь сделать?   -  person Jonathan Nixon    schedule 11.01.2013
comment
Я хочу получить рабочие элементы из tfs и отобразить на веб-сайте (asp.net mvc). Я хочу пейджинг при отображении, но кажется, что wiql не поддерживает работу с клавишами LIMIT для этого. Знаете ли вы другие способы сделать это?   -  person knowwebapp.com beautiful-theme    schedule 12.01.2013


Ответы (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, это поле добавляется в набор выгружаемых полей. Выполняется еще один круговой обход, чтобы обновить эту страницу, чтобы включить значения этого поля.

person Grant Holliday    schedule 01.02.2013
comment
О, это глупо. Я использую VSO REST API. Я могу получить все рабочие элементы сразу (в одном запросе), поскольку он возвращает не более 20 000 элементов (ответ содержит ошибку), а идентификаторы начинаются с ~ 180 000 и заканчиваются примерно на ~ 310 000. Также могут быть дыры в идентификаторах, в зависимости от условий запроса. - person David Ferenczy Rogožan; 27.08.2015
comment
Если бы я использовал клиентскую библиотеку API с пейджингом вместо REST API, как там работает пейджинг? Выдает ли он результаты локально (т. е. запрашивает все сразу из VSO) или запрашивает только PageSize количество результатов? - person David Ferenczy Rogožan; 27.08.2015
comment
Раздражает, что нет функции LIMIT, и все же VSO ограничивает запрос результатов до 20 КБ как ошибку. - person Jmoney38; 04.10.2016
comment
@DavidFerenczyRogožan Немного опоздал на вечеринку, но вы можете ограничить ответ в REST API, например, используя $top=200. Если вы заказываете свой запрос на System.Id и создаете динамический запрос, в котором вы сохраняете последний идентификатор, возвращенный из предыдущего вызова, все готово. - person riezebosch; 28.04.2020

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

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

Использование Skip и Take вместе может работать для пейджинга.

person Mario    schedule 08.10.2013