为什么我的参数没有被替换?

时间:2018-11-30 02:36:22

标签: c# azure-cosmosdb azure-cosmosdb-sqlapi

我正在使用以下查询来查询CosmosDB,由于ARRAY_CONTAINS,我无法使用LINQ。问题是我的应用程序崩溃,因为SQLParameter从未被替换,因此为null异常。

查询看起来像这样

     var sqlStatement = new SqlQuerySpec
    {
      QueryText = "SELECT * FROM c where ARRAY_CONTAINS(c.locales[0].categories, @category)",
      Parameters = new SqlParameterCollection()
    {
       new SqlParameter{ Name = "@category", Value = "Homeware" }
    }
  };

   IDocumentQuery<JObject> query = client.CreateDocumentQuery<JObject>(
 collectionUr
 sqlStatement)
 .AsDocumentQuery();

 while (query.HasMoreResults)
{
  items.AddRange(await query.ExecuteNextAsync<JObject>());
}

2 个答案:

答案 0 :(得分:0)

您可以参考以下对我有用的代码:

var Parameters = new SqlParameterCollection()
       {
          new SqlParameter(Name = "@category", Value = "Homeware")
       };

IQueryable<Pojo> queryable = client.CreateDocumentQuery<Pojo>(
        uri,
        new SqlQuerySpec
        {
         QueryText = "SELECT * FROM c where ARRAY_CONTAINS(c.locales[0].categories, " + Parameters[0].Value + ")" 
        });

答案 1 :(得分:0)

对不起,但杰伊的答案是错误的。他的方法实际上并没有参数化SqlQuerySpec,而只是将字符串连接起来,而字符串却不能正确地参数化查询。就像没有开始的参数收集一样。

我刚刚测试了您提供的代码,并获得了与您完全相同的数据集,这绝对没问题。空异常与您的SqlParameterCollection无关。

相同的代码工作方式:

使用的数据集

![]()