Cosmos DB SQL API使用NOT IN操作符传入List参数不生效问题
问题根因
你当前的写法是将ID列表拼接为单个逗号分隔的字符串传入参数,Cosmos DB会将@ids识别为单个字符串值,而不是多个值的集合。相当于实际执行的逻辑是p.id NOT IN ("id1,id2,id3"),只会排除ID等于整个长字符串的条目,自然返回所有数据。这和你在查询编辑器中直接写NOT IN("id1","id2")传入多个独立字符串值的逻辑完全不同。
修复方案
Cosmos DB SQL API原生支持数组类型的参数,不需要手动拼接逗号分隔字符串,直接将ID数组作为参数传入即可,修改后代码如下:
var ids = IdsList.Select(pID => pID.ID).ToArray(); var response= await MyService.GetByMyQuery( new QueryDefinition( "SELECT * FROM p WHERE p.id NOT IN(@ids)" ) .WithParameter("@ids", ids), );
边界注意事项
- 如果传入的
ids是空数组,NOT IN 空集合的逻辑会匹配容器内的所有条目,如果需要空数组时返回空结果,需要额外增加判断逻辑 - Cosmos DB默认区分字符串大小写,如果存储的ID和传入的ID大小写不一致,也会导致过滤不生效
内容的提问来源于stack exchange,提问作者Francisco Arias
相关产品推荐
相关产品推荐

