参数化 Where IN 子句不适用于 CosmosClient QueryDefinition 对象

Rah*_*l C 9 .net c# azure-cosmosdb azure-cosmosdb-sqlapi asp.net-core-3.1

我正在尝试编写一个包含 IN 子句的参数化查询。

对于前:

工作代码

输入字符串:“'guid1','guid2','guid3'”

public List<Employee> GetEmployeeIds(string ids){
QueryDefinition query =new QueryDefinition(@"Select * from Employee where Employee.Id in ("+ ids+")");
var result = GetDetails(query,cosmosClient);
return result;
}
Run Code Online (Sandbox Code Playgroud)

结果:返回预期结果

非工作代码

输入字符串:“'guid1','guid2','guid3'”

public List<Employee> GetEmployeeIds(string ids){
QueryDefinition query =new QueryDefinition(@"Select * from Employee where Employee.Id in ( @ids )")
                  .WithParameter("@ids", ids);
var result = GetDetails(query,cosmosClient);
return result;
}
Run Code Online (Sandbox Code Playgroud)

结果:返回0

上述代码使用的NuGet包: Microsoft.Azure.Cosmos 3.8.0

注意:我已尝试此链接中提到的所有选项,但它不适用于 CosmosClient QueryDefinition 对象 WHERE IN 与 Azure DocumentDB (CosmosDB) .Net SDK

对此的任何帮助都将受到高度赞赏。

提前致谢。!!

小智 9

这对我有用,其中@ids是列表类型,IN我不使用关键字,而是使用ARRAY_CONTAINS函数:

List<long> ids = new List<long>();
ids.Add(712300002201);
ids.Add(712300002234);

var querySql = @"Select * from Employee where ARRAY_CONTAINS(@ids, Employee.Id)";
var queryDefinition = new QueryDefinition(query).WithParameter("@ids", ids);
Run Code Online (Sandbox Code Playgroud)

  • 正如目前所写的,您的答案尚不清楚。请[编辑]添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (3认同)

Mar*_*ell 2

我猜你的ids价值是这样的"12,42,94,7"。作为字符串参数@ids,表达式与 )in (@ids)大致相同,如果值是单独的数字、和,in ('12,42,94,7'则它将不匹配任何值。当您使用简单的连接版本时,含义有所不同 - 即(注意缺少引号),这是 4 个整数值,而不是 1 个字符串值。1242947in (12,42,94,7)

基本上:当参数化时,您需要

  1. 使用多个参数,每个值一个,即最终得到in (@ids0, @ids1, @ids2, @ids3)4 个参数值(通过在 C# 代码中拆分字符串,或者使用不同的参数类型 - 也许params int[] ids
  2. 使用类似于 SQL Server 函数的函数STRING_SPLIT(如果 CosmosDB 存在类似的函数) - 即in (select value from STRING_SPLIT(@ids,','))