TFS2015获取用户与共享查询所有者:用户查询所有者为空问题求助
解决TFS2015私有查询所有者显示Null的问题
针对你遇到的TFS2015中私有查询所有者返回Null的问题,我分两种方案给你解决:
一、SQL数据库查询方案
你当前的查询直接关联QueryItems.OwnerIdentifier是行不通的,因为TFS2015里只有私有查询的根文件夹(My Queries)会存储OwnerIdentifier,子查询的该字段为空。需要通过递归查询找到每个私有查询对应的根My Queries文件夹,再关联用户信息:
WITH QueryHierarchy AS ( -- 初始节点:所有私有查询的根文件夹(My Queries) SELECT qi.QueryItemId, qi.Name, qi.OwnerIdentifier, qi.ParentQueryItemId, qi.fPublic, qi.fFolder, qi.fDeleted FROM [Tfs_Development].[dbo].[QueryItems] qi WHERE qi.fPublic = 0 AND qi.fFolder = 1 AND qi.ParentQueryItemId IS NULL UNION ALL -- 递归子节点:所有私有查询/子文件夹 SELECT child.QueryItemId, child.Name, parent.OwnerIdentifier, -- 继承根文件夹的OwnerIdentifier child.ParentQueryItemId, child.fPublic, child.fFolder, child.fDeleted FROM [Tfs_Development].[dbo].[QueryItems] child INNER JOIN QueryHierarchy parent ON child.ParentQueryItemId = parent.QueryItemId WHERE child.fDeleted = 0 ) SELECT qh.Name AS 'Query Name', c.DisplayPart AS 'Query Owner', qh.fPublic, qh.fFolder, qh.fDeleted FROM QueryHierarchy qh LEFT JOIN [Tfs_Development].[dbo].[Constants] c ON c.TeamFoundationId = qh.OwnerIdentifier WHERE qh.fDeleted = 0 -- 可以根据需要筛选是否只看查询(非文件夹):AND qh.fFolder = 0
这个查询通过CTE递归遍历私有查询的层级结构,将根文件夹的所有者ID传递给所有子查询/文件夹,这样就能正确获取到私有查询的所有者了。
二、REST API方案
如果不想直接操作数据库,TFS2015的REST API可以更方便地获取查询及其所有者信息,只需要在请求中指定$expand=owner参数:
获取所有私有查询(含所有者)
发送GET请求到:
http://<你的TFS服务器地址>/tfs/<项目集合>/_apis/wit/queries/myQueries?api-version=1.0&$expand=owner
获取所有查询(私有+共享,含所有者)
发送GET请求到:
http://<你的TFS服务器地址>/tfs/<项目集合>/_apis/wit/queries?api-version=1.0&$expand=owner
返回的JSON数据中,每个查询对象的owner字段会包含用户的ID、显示名等信息,不需要手动关联数据库表,更安全可靠。
注意:使用REST API需要有对应的TFS权限,确保你有读取查询的权限。
内容的提问来源于stack exchange,提问作者W. Siegmund
相关产品推荐
相关产品推荐

