【问题标题】:Cosmos DB SQL API NOT IN operator taking a List WithParameter(List<t>) not workingCosmos DB SQL API NOT IN 运算符采用 List WithParameter(List<t>) 不起作用
【发布时间】:2021-09-09 19:00:21
【问题描述】:
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")

它返回预期的结果没有任何问题。所以我猜问题出在代码层,我将 ids 传递给 WithParameter() menthod 的方式。

非常感谢任何见解。

【问题讨论】:

  • 查询不同,第一个是过滤id,后一个是贷款号
  • 是的@Sajeetharan 抱歉打错了

标签: c# sql azure-cosmosdb


【解决方案1】:

问题

您的 C# 代码不是发送多个值作为 @ids 参数,而是一个字符串值,实际上是这样的:

SELECT * FROM p 
WHERE p.id NOT IN("id1, id2")

由于此复合 id 不存在,因此它会返回您观察到的所有项目。

解决方案

IN 关键字也有可能,但我确信这种模式会起作用:

SELECT * FROM p 
WHERE NOT ARRAY_CONTAINS(@ids, p.id)

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

【讨论】:

  • 感谢回复,但是查询需要返回所有没有在NOT IN()语句中列出的IDS。例如,如果数据集是 ("a","b","c","d","e","f","g") 并且查询是 NOT IN ("a","d", "b","c") 它将返回 ["e","f","g"]。关于索引,是的,我可以添加索引,但我主要关心的是先让查询工作。
  • 这就是为什么在解决方案查询中有NOT
  • 我想我误解了你写的查询。 p.id 不是我提供的参数,它来自SELECT * FROM p 结果集。我会试试这个,如果它有效,请将其标记为解决方案。提前谢谢伙计。
  • 我正在使用 SQL API,但似乎 NOT ARRAY_CONTAINS 不是我可以在那里使用的函数。
  • 嗯.. 它是:docs.microsoft.com/en-us/azure/cosmos-db/sql/…。你已经修复了你的.WithParameter(..),对吧?
猜你喜欢
  • 2020-06-06
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多