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", string.Join(",", ids)),
);
所以这是行不通的。运算符返回所有项目,而不仅仅是不在列表中的项目。在 cosmos DB SQL 查询编辑器中我可以轻松做到
SELECT * FROM p WHERE p.id NOT IN("id1","id2")
它毫无问题地返回了预期的结果。所以我猜问题出在代码层,即我将 id 传递给 WithParameter() menthod 的方式。
非常感谢任何见解。
最佳答案
问题
您的 C# 代码没有发送多个值作为 @ids
参数,而是发送一个字符串值,实际上是这样的:
SELECT * FROM p
WHERE p.id NOT IN("id1, id2")
由于此复合 ID 不存在,因此它会返回您观察到的所有项目。
解决方案
IN
关键字也有可能,但我确信这种模式会起作用:
SELECT * FROM p
WHERE NOT ARRAY_CONTAINS(@ids, p.id)
注意!如果我弄错了请纠正我,但这种情况很可能不会由索引提供。因此,您可能需要重新考虑您的设计,除非您的真实案例有一个额外的良好可索引谓词,否则它会很慢且代价高昂。
关于c# - Cosmos DB SQL API NOT IN 运算符采用 List WithParameter(List<t>) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69123474/