我正在尝试按其完整路径(比“我的查询”/“共享查询”更深)和查询名称访问已保存的TFS查询。
方案是用户可以将路径添加到其团队目录,并将其工作项的名称查询到config 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
使用“共享查询”或“我的查询”更改文件夹,它能够找到该文件夹,但在尝试按名称查找查询时会得到相同的异常。正如预期的那样,如果查询位于根文件夹(共享/我的查询)中,则可以正常工作。
那么如何更深入地搜索根文件夹呢?
(到目前为止,所有互联网搜索仅产生了使用根文件夹的示例)
答案 0 :(得分:3)
这种自递归方法将从查询树中找到您的查询(如果存在):
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" );
答案 1 :(得分:0)
您可以解析文件夹的完整路径到子文件夹集,然后创建一个循环到&#34;向下移动&#34;文件夹树。获得下一个子文件夹的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];
}
之后,您将能够使用查询文件夹变量来处理其中的查询。
答案 2 :(得分:0)
上面的递归答案可以用,但是由于item.Path包含了从根开始的整个路径,而我传入的路径却没有,所以我对此有疑问。最终结果为空值。我还发现它在到达所需文件夹的过程中触及了整个树中的每个文件夹,因此还做了很多额外的工作。
我选择了一个简单的向下钻取,专门查找我知道/应该在那里的节点,从而忽略了所有谷壳,从而使该方法更加有效。我从根传递完整路径,并使用字符串.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;
}