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

标签 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)),
            );

所以这是行不通的。运算符返回所有项目,而不仅仅是不在列表中的项目。在 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/

相关文章:

sql - 插入查询给出 ORA-01722 : invalid number error

Azure DocumentDB Multi-Tenancy 架构

node.js - 无法连接到azure cosmos db中的Mongodb

c# - 坚持解析

c# - SpriteFont 不适用于 MonoGame

java - Hibernate 4 和 5 的 db2 中序列 SQL 的差异

c# - 将 GraphQL 查询映射到 Select() linq 到 sql

c# - 处理程序映射的嵌套 WebAPI 问题(继承问题?)

c# - 如何确保时间戳始终是唯一的?

sql - 迷你数据库 - 子查询返回超过 1 个值