Fra*_*ias 3 c# sql azure-cosmosdb
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)),
);
Run Code Online (Sandbox Code Playgroud)
所以这是行不通的。该运算符返回所有项目,而不是仅返回列表中未包含的项目。在cosmos DB SQL查询编辑器中我可以轻松做到
SELECT * FROM p WHERE p.id NOT IN("id1","id2")
Run Code Online (Sandbox Code Playgroud)
并且它返回预期结果,没有任何问题。所以我猜问题出在代码层,即我将 id 传递给 WithParameter() 方法的方式。
任何见解都将不胜感激。
您的 C# 代码不会发送多个值作为@ids参数,而是发送单个字符串值,实际上如下所示:
SELECT * FROM p
WHERE p.id NOT IN("id1, id2")
Run Code Online (Sandbox Code Playgroud)
由于此复合 ID 不存在,因此它会返回您观察到的所有项目。
也可以使用IN关键字,但我确实知道这种模式会起作用:
SELECT * FROM p
WHERE NOT ARRAY_CONTAINS(@ids, p.id)
Run Code Online (Sandbox Code Playgroud)
注意!如果我弄错了,请纠正我,但索引很可能不会满足这种条件。因此,您可能需要重新考虑您的设计,除非您的实际案例有一个额外的良好可索引谓词,否则它将很慢且成本高昂。