【问题标题】:How to use LIMIT keyword as using in ms sql by WIQL to query TFS workItem如何使用 LIMIT 关键字在 WIQL 的 ms sql 中使用来查询 TFS 工作项
【发布时间】:2012-12-26 07:17:19
【问题描述】:

我正在研究 TFS API,我不知道 TFS API 有没有 LIMIT 关键字之类的东西。我需要它来分页。

谢谢

【问题讨论】:

  • 你能解释一下你要做什么吗?
  • 我想从 tfs 获取工作项并显示在网站 (asp.net mvc) 上。我想在显示时进行分页,但这似乎 wiql 不支持 LIMIT 键工作。你知道其他的事情吗?

标签: tfs workitem tfs-workitem tfs-sdk wiql


【解决方案1】:

在 TFS WIQL 中没有与 SQL LIMIT 关键字等效的东西,您需要自己实现分页。

一种方法是在第一次访问时检索所有结果,并将它们缓存并自己分页。

另一种方法是在每次用户页面时动态构建 WIQL 查询。例如:

  1. 运行 WIQL 查询以仅返回与查询匹配的工作项 ID。 SELECT [System.Id] FROM WorkItems WHERE <conditions>
  2. 缓存该 ID 列表
  3. 将该 ID 列表分成与您的分页大小相匹配的组
  4. 每次用户页面时,都明确地请求工作项的 ID。 SELECT <fields> FROM WorkItems WHERE [System.Id] IN (10,11,12,13,14,15)

根据您要实现的目标,您还应该知道 TFS 工作项跟踪 API 在后台为字段值实现分页/延迟加载,以最大限度地延长响应时间。您可以通过附加网络嗅探器并在 Visual Studio 中滚动大型工作项查询来了解其工作原理。

更多信息请见Paging of Field Values

您可以通过选择所有字段来最大程度地减少到服务器的往返行程 您的代码将使用。以下代码进行一次往返 每次返回一页标题的查询和一次往返 访问一个新页面。

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

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

如果您的代码访问您未在 SELECT 中指定的字段 子句,该字段被添加到分页字段集中。再来一轮 执行行程以刷新该页面以包含该页面的值 字段。

【讨论】:

  • 哦,这太愚蠢了。我正在使用 VSO REST API。我可以一次获取所有工作项(在一个请求中),因为它不会返回超过 20,000 个项目(响应包含错误),并且 ID 从 ~180,000 开始并在 ~310,000 左右结束。根据查询条件,ID 中也可能存在漏洞。
  • 如果我使用带有分页功能的 API 客户端库而不是 REST API,那么分页是如何工作的?它是在本地分页结果(即一次从 VSO 请求所有内容)还是仅请求 PageSize 个结果?
  • 没有 LIMIT 功能很烦人,但 VSO 将结果查询限制为 20K 作为错误。
  • @DavidFerenczyRogožan 有点晚了,但您可以使用 $top=200 来限制 REST API 上的响应。如果您在 System.Id 上订购查询并构建一个动态查询,您可以在其中存储上次调用返回的最后一个 ID,那么您就大功告成了。
【解决方案2】:

我有同样的问题。我在序列上应用了Take 以限制查询提供的结果。不幸的是,这实际上并没有限制数据库返回的结果,但由于该功能不受支持,它提供了一个可行的选项。

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

同时使用SkipTake 可以进行分页。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2015-06-20
    • 2017-07-05
    • 2012-02-05
    • 1970-01-01
    • 2019-12-04
    • 2023-03-05
    • 2011-08-31
    相关资源
    最近更新 更多