Cosmos DB SQL API NOT IN 运算符采用 List WithParameter(List<t>) 不起作用

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() 方法的方式。

任何见解都将不胜感激。

Imr*_*vel 5

问题

您的 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)

注意!如果我弄错了,请纠正我,但索引很可能不会满足这种条件。因此,您可能需要重新考虑您的设计,除非您的实际案例有一个额外的良好可索引谓词,否则它将很慢且成本高昂。