【问题标题】:Query for TFS Stored/Saved query by Full path and Query Name (Queries not in 'My Queries' or 'Shared Queries')按完整路径和查询名称查询 TFS 存储/保存的查询(不在“我的查询”或“共享查询”中的查询)
【发布时间】:2018-12-04 05:23:29
【问题描述】:

我正在尝试通过完整路径(比“我的查询”/“共享查询”更深)和查询名称访问已保存的 TFS 查询。

该场景是用户可以将路径添加到他们的团队目录,并将他们的工作项查询的名称添加到配置 xml 文件中。我读取了 xml 并获取了数据。

示例 XML

<Teams>
  <Team name ="MyTeam">
    <Query project="MyProj" queryfolder="Shared Queries/blah/blah2/MyTeamFolder" queryName="MyTeams WorkItems - All Workitems"/>
  </Team>
</Teams>

我希望使用“queryfolder”和“queryName”在 TFS 中查找查询 到目前为止,我所拥有的适用于根目录(“我的查询”/“共享查询”),但我无法弄清楚如何让某些东西适用于更深层次的路径。

这不起作用:

  QueryHierarchy queryRoot = workItemStore.Projects["MyProj"].QueryHierarchy;
                QueryFolder folder = (QueryFolder)queryRoot["Shared Queries/blah/blah2/MyTeamFolder"];
                QueryDefinition query = (QueryDefinition)folder["MyTeams WorkItems - All Workitems"];
                string queryResults = query.QueryText;

这将在查找文件夹时出错QueryFolder folder = (QueryFolder)queryRoot[".."]

带有KeyNotFoundException

使用“共享查询”或“我的查询”更改文件夹,它能够找到该文件夹​​,但在尝试按其名称查找查询时会出现相同的异常。正如预期的那样,如果查询位于根文件夹(共享/我的查询)中,它可以正常工作。

那么,除了根文件夹之外,我该如何进行更深入的搜索呢?

(到目前为止,所有互联网搜索都只找到了使用根文件夹的示例)

【问题讨论】:

    标签: c# tfs


    【解决方案1】:

    如果存在,这种自递归方法将从查询树中找到您的查询:

        static QueryDefinition GetQueryDefinitionFromPath(QueryFolder folder, string path)
        {
            return folder.Select<QueryItem, QueryDefinition>(item =>
            {
                return item.Path == path ?
                    item as QueryDefinition : item is QueryFolder ?
                    GetQueryDefinitionFromPath(item as QueryFolder, path) : null;
            })
            .FirstOrDefault(item => item != null);
        }
    

    你的例子已经给出,调用

      var myquery = GetQueryDefinitionFromPath( (QueryFolder)workItemStore.Projects["MyProj"].QueryHierarchy, "Shared Queries/blah/blah2/MyTeamFolder/MyTeams WorkItems - All Workitems" );
    

    【讨论】:

      【解决方案2】:

      上面的递归答案可以工作,但我遇到了问题,因为 item.Path 包括从根目录开始的整个路径,而我传入的路径没有;产生一个空值作为最终结果。我还发现它会做很多额外的工作,因为它会在到达所需文件夹的过程中触及整个树中的每个文件夹。

      我选择了一个简单的向下钻取,专门寻找我知道会/应该在那里的节点,通过忽略所有的谷壳使该方法更加高效。我从根传入完整路径并使用 string.Split('/').Skip(1).ToArray() 移动越过根节点,避免 KeyNotFoundException 因为根不包含自身。我故意没有处理找不到文件夹的情况,因为我们完全控制了我们传入的内容,并且应该只提供有效的路径。

      代码是:

          private static QueryFolder GetQueryFolderFromPath(QueryFolder folder, string path)
          {
              var pathNodes = path.Split('/').Skip(1).ToArray();
      
              foreach(var node in pathNodes)
              {
                  folder = (QueryFolder)folder[node];
                  if (folder != null && folder.Path.Equals(path))
                      break;
              }
              return folder;
          }
      

      【讨论】:

        【解决方案3】:

        您可以将文件夹完整路径解析为一组子文件夹,然后创建一个循环以“向下移动”文件夹树。您将获得下一个子文件夹的 QueryFolder 实例并将其分配给相同的变量,直到您到达最后一个。

        这是我在项目中使用的这个想法的实现:

        string folderPath = "Shared Queries/blah/blah2/MyTeamFolder";
        string currentSubfolder = folderPath.IndexOf("/") > 0 ?
            folderPath.Substring(0, folderPath.IndexOf("/")) : 
            folderPath;
        QueryFolder queryFolder = (QueryFolder)workItemStore.Projects["MyProj"].QueryHierarchy[currentSubfolder];
        while (folderPath.IndexOf("/") > 0)
        {
            folderPath = folderPath.Substring(folderPath.IndexOf("/") + 1);
            currentSubfolder = folderPath.IndexOf("/") > 0 ? 
                folderPath.Substring(0, folderPath.IndexOf("/")) : 
                folderPath;
            queryFolder = (QueryFolder)queryFolder[currentSubfolder];
        }
        

        之后,您将能够使用查询文件夹变量来处理其中的查询。

        【讨论】:

          猜你喜欢
          • 2018-06-17
          • 2013-06-28
          • 1970-01-01
          • 1970-01-01
          • 2018-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多