You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CosmosDB SQL查询在Azure Portal正常运行但C#代码执行返回0结果的问题排查

问题分析与解决方案

我之前也碰到过类似的Cosmos DB查询在Portal正常但Azure Function返回0的情况,结合你的代码和描述,大概率是以下几个细节没处理好,给你逐一排查:

1. 分区键的大小写与匹配问题

Cosmos DB的分区键是大小写敏感的,而且当你在代码中指定PartitionKey时,只会查询对应分区的数据:

  • 你需要确认代码中传入的brand变量(即使硬编码)是否和数据中c.Brand的大小写完全一致,比如数据里是'XXX'但代码里传'xxx',就会查错分区返回0。
  • 另外,如果你在Portal运行查询时默认跨所有分区(未指定分区键),但代码里指定了单个分区,而符合条件的数据不在这个分区里,也会返回0。这种情况可以先去掉PartitionKey参数测试(注意跨分区查询的性能影响),确认数据分布后再调整。

2. 查询语句的字符串拼接隐患

你当前用字符串拼接的方式写SQL,很容易出现空格缺失或语法错误(虽然你说硬编码后还是有问题,但建议优化写法避免后续坑)。推荐用C#的多行字符串(@前缀)+ 字符串插值来构建查询,更直观且不易出错:

var sqlQuery = $@"
SELECT COUNT(UniqueIDValues) AS UniqueCount 
FROM ( 
    SELECT DISTINCT c.id 
    FROM c 
    JOIN i IN c.ItemsInBasket 
    WHERE c.Brand = '{brand}' 
    AND i.Item.PromotionName = 'PromOnePiece_20201029_202001_25' 
    AND c.IsRedeemed = false 
    AND c.IsDeleted = false 
) AS UniqueIDValues";

3. StreamIterator的JSON解析错误

你用GetItemQueryStreamIterator手动解析流的方式容易出错,比如返回的JSON结构中Documents数组的路径是否正确?建议改用强类型的GetItemQueryIterator<T>,简化解析逻辑:
首先定义一个结果类:

public class PromotionCountResult
{
    public int UniqueCount { get; set; }
}

然后修改查询代码:

var queryDefinition = new QueryDefinition(sqlQuery);
var setIterator = _container.GetItemQueryIterator<PromotionCountResult>(
    queryDefinition,
    requestOptions: new QueryRequestOptions() { 
        PartitionKey = new PartitionKey(brand), 
        MaxConcurrency = -1, 
        MaxItemCount = -1 
    });

while (setIterator.HasMoreResults)
{
    var response = await setIterator.ReadNextAsync();
    if (response.Any())
    {
        numberOfPromotions = response.First().UniqueCount;
        return numberOfPromotions;
    }
}
return 0;

这种方式不需要手动处理流和JSON解析,能避免很多解析错误导致的结果获取失败。

4. 索引策略的潜在问题

虽然Portal能查到结果,但如果你的容器索引策略没有覆盖查询中的过滤条件(比如i.Item.PromotionName、c.IsRedeemed等),在代码中指定分区键后可能出现索引未命中导致的空结果?不过这种概率较低,你可以先检查容器的索引策略是否包含这些路径,或者临时开启EnableScanInQuery = true在QueryRequestOptions中测试(不建议生产环境长期使用):

requestOptions: new QueryRequestOptions() { 
    PartitionKey = new PartitionKey(brand), 
    MaxConcurrency = -1, 
    MaxItemCount = -1,
    EnableScanInQuery = true
}

先从分区键和查询写法这两个最常见的问题入手排查,应该能快速定位到原因。

内容的提问来源于stack exchange,提问作者Matt Douhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:37:41