首页 > 解决方案 > 为什么从 C# 代码运行此 CosmosDB SQL 查询会失败?

问题描述

我正在 CosmosDB 中的 azure 门户数据资源管理器中运行此查询,它运行良好

SELECT COUNT(UniqueIDValues) AS UniqueCount
FROM ( 
        SELECT DISTINCT c.id 
        FROM c 
        JOIN i IN c.ItemsInBasket 
        WHERE c.Brand = 'xxx' 
        AND i.Item.PromotionName = 'PromOnePiece_20201029_202001_25'
        AND c.IsRedeemed = false
        AND c.IsDeleted = false
    ) AS UniqueIDValues

它产生预期的结果

[
    {
        "UniqueCount": 4
    }
]

但是如果我从这样的天蓝色函数运行相同的查询

FeedIterator setIterator = _container.GetItemQueryStreamIterator(
               $"SELECT COUNT(UniqueIDValues) AS UniqueCount " +
               $"FROM ( " +
               $"SELECT DISTINCT c.id " +
               $"FROM c " +
               $"JOIN i IN c.ItemsInBasket " +
               $"WHERE c.Brand = 'xxx' " +
               $"AND i.Item.PromotionName = 'PromOnePiece_20201029_202001_25' " +
               $"AND c.IsRedeemed = false " +
               $"AND c.IsDeleted = false " +
               $" ) AS UniqueIDValues",
              requestOptions: new QueryRequestOptions()
              {
                  PartitionKey = new PartitionKey(brand),
                  MaxConcurrency = -1,
                  MaxItemCount = -1
              });

            while (setIterator.HasMoreResults)
            {
                using (ResponseMessage response = await setIterator.ReadNextAsync())
                {
                    if (response.IsSuccessStatusCode)
                    {
                        using (StreamReader sr = new StreamReader(response.Content))
                        using (JsonTextReader jtr = new JsonTextReader(sr))
                        {
                            JsonSerializer jsonSerializer = new JsonSerializer();
                            JObject items = jsonSerializer.Deserialize<JObject>(jtr);

                            numberOfPromotions = (decimal?)items.SelectToken("Documents[0].UniqueCount");

                            return numberOfPromotions ?? 0;
                        }
                    }
                }
            }

这返回 0 个结果,我不知道为什么,我检查了所有变量它们是否正确,我什至对它们进行了硬编码,但在通过 SDK 运行时它仍然无法工作。

我在这里想念什么?

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

解决方案


假设对于其他查询运行相同的代码,可能有以下原因导致它不起作用:

  1. 它在错误的地方(容器或帐户)查询。
  2. 代码生成的查询错误(使用调试器复制查询值并在 Azure 数据资源管理器中运行)。
  3. 当您阅读记录时,它们已被其他应用程序删除。
  4. 您正在查询错误的分区键(您正在查询的分区键没有任何此类记录)。

推荐阅读