为何Cosmos DB添加Where谓词后查询无结果?存在对应ID记录
问题分析:添加Where谓词后Cosmos DB查询无结果
下面这段代码在注释掉Where谓词时能正常返回数据,但取消注释后,即便存在Id为"1"的记录,也查不到任何结果:
var query = container.GetItemLinqQueryable<MyTasks>( requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(null) } );//.Where(p => p.Id == "1"); var feedIterator = container.GetItemQueryIterator<MyTasks>(query.ToQueryDefinition()); var results = new List<MyTasks>(); while (feedIterator.HasMoreResults) { results.AddRange(await feedIterator.ReadNextAsync()); } foreach (var item in results) { Console.WriteLine($"Matched item: {item.Name}"); }
核心原因
问题出在指定了PartitionKey = new PartitionKey(null),同时添加了Where谓词:
- 当设置
PartitionKey=null时,Cosmos DB只会在分区键值为null的分区内执行查询; - 目标记录(Id为"1")并不在分区键值为
null的分区中,所以添加Where谓词后无法匹配到结果; - 注释Where谓词时能查到数据,是因为此时查询返回了分区键值为
null的分区内所有记录,并非全量数据。
另外需确认:实体类中的Id属性是否正确映射到Cosmos DB的系统字段id(小写),若混淆自定义属性和系统id,也会导致查询无结果。
解决方案
- 如果容器是分区容器:
- 移除
PartitionKey = new PartitionKey(null)的设置,或将其替换为目标记录对应的分区键值; - 若需跨分区查询,需开启
QueryRequestOptions中的EnableCrossPartitionQuery(注意跨分区查询性能较低,需谨慎使用)。
- 移除
- 如果容器是无分区容器:直接删除
PartitionKey的设置,无分区容器无需指定分区键即可查询全量数据。 - 检查属性映射:确保实体类的
Id属性通过[JsonProperty("id")]或其他方式正确映射到Cosmos DB的系统id字段,避免因字段名不匹配导致查询失败。
内容的提问来源于stack exchange,提问作者thefunctionofnoreturn
相关产品推荐
相关产品推荐

