【问题标题】:Filtering a WIQL Query with C#使用 C# 过滤 WIQL 查询
【发布时间】:2018-10-11 22:16:23
【问题描述】:

我需要一些帮助来过滤 SQL WIQL 查询。如何修改下面的代码以忽略具有空模型值的字段?例如,如果用户只想过滤一个像工作项类型这样的字段而忽略状态字段?任何帮助将不胜感激。

 public async Task<ActionResult> Method(filterModel model)
   {
        VssConnection connection = new VssConnection(new 

        Uri(vstsCollectionUrl), new VssClientCredentials());

        WorkItemTrackingHttpClient witClient = connection.GetClient<WorkItemTrackingHttpClient>();
        Wiql query = new Wiql() { Query = "SELECT [Id], [Title] FROM workitems WHERE [Work Item Type] = '" + model.workitem + "' && 
        [State] = '"+ model.state + "'"};
        WorkItemQueryResult queryResults = witClient.QueryByWiqlAsync(query).Result;

        if (queryResults == null || queryResults.WorkItems.Count() == 0)
        {
            Console.WriteLine("Query did not find any results");          
        }
    }

【问题讨论】:

  • 你有比这更大的问题......你的查询没有参数化,这是一个等待发生的 SQL 注入攻击,在这里了解更多>>>> blogs.msdn.microsoft.com/sqlphp/2008/09/30/…
  • 是的,我从 Microsoft 网站上关于如何使用 tfs Web API 的示例中获取了这段代码。只是想知道如何修改。
  • @AydinAdn 这是针对 Azure Dev Ops 的查询 - 正式的 VSTS。 WIQL 具有类似 SQL 的查询语法,但它不是真正的 SQL,并且不支持参数。 docs.microsoft.com/en-us/rest/api/vsts/wit/wiql/…
  • OP 您将需要创建代表不同过滤器场景的多个查询,然后使用您的过滤器来确定执行哪一个。您的查询将是包含过滤器场景的预定义字符串文字。或者根据模型的值动态创建 SQL 查询。
  • @fourwhey 哎呀,当我阅读 SQL 查询时,我没有费心阅读整个代码,只阅读包含查询的行。感谢您提供链接,将继续阅读此内容

标签: c# azure-devops filtering wiql


【解决方案1】:

只需删除此代码&amp;&amp; [State] = '"+ model.state + "'

public async Task<ActionResult> Method(filterModel model)
{
    VssConnection connection = new VssConnection(new 

    Uri(vstsCollectionUrl), new VssClientCredentials());

    WorkItemTrackingHttpClient witClient = connection.GetClient<WorkItemTrackingHttpClient>();
    Wiql query = new Wiql() { Query = "SELECT [Id], [Title] FROM workitems WHERE [Work Item Type] = '" + model.state + "'" };
    WorkItemQueryResult queryResults = witClient.QueryByWiqlAsync(query).Result;

    if (queryResults == null || queryResults.WorkItems.Count() == 0)
    {
        Console.WriteLine("Query did not find any results");          
    }
}

更好更清晰的方法:

Wiql query = new Wiql() { Query = $"SELECT [Id], [Title] FROM workitems WHERE [Work Item Type] = {model.state}"};

【讨论】:

  • 这个支持分页吗?获取以下内容:请求 URI 太长。正因为有很多项目。
  • 啊,知道了,第二次调用添加了所有 ID。我会做更多的测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
相关资源
最近更新 更多