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

标签 c# .net azure-cosmosdb asp.net-core-3.1 azure-cosmosdb-sqlapi

我正在尝试编写一个包含 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;
}

结果:返回预期结果

非工作代码

输入字符串:“'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;
}

结果:返回0

上述代码使用的

NuGet包:Microsoft.Azure.Cosmos 3.8.0

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

非常感谢对此的任何帮助。

提前致谢!

最佳答案

我猜你的 ids 值类似于 "12,42,94,7"。作为字符串参数@ids,表达式in (@ids)in ('12,42,94,7'大致相同>),它将不匹配任何值,如果值是个人数字1242947。当您使用简单的串联版本时,含义不同 - 即 in (12,42,94,7)(注意缺少引号),它是 4 个整数值,而不是 1 个字符串值。

基本上:在对其进行参数化时,您需要要么

  1. 使用多个参数,每个值一个,即以具有 4 个参数值的 in (@ids0, @ids1, @ids2, @ids3) 结束(通过在 C# 代码中拆分字符串,或使用不同的参数类型——可能是 params int[] ids)
  2. 使用类似于 STRING_SPLIT SQL Server 函数的函数,如果 CosmosDB 存在类似的函数 - 即 in (select value from STRING_SPLIT(@ids,','))

关于c# - 参数化 Where IN 子句不适用于 CosmosClient QueryDefinition 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70878491/

相关文章:

C# 用户控件显示

azure-cosmosdb - 对 Azure Cosmos DB 中的嵌套字段建立索引

c# - 为什么 C# volatile 不保护读写重排序?

node.js - 请求率大

azure - 如何在 Microsoft Azure Functions 中将 DocumentDB 数据库输入绑定(bind)与服务总线触发器绑定(bind)和 BrokeredMessage 结合使用?

c# - 如何在 Unity Test Runner 中测试 Unity 协程

c# - 将数组作为属性值传递

c# - Linq to XML 根据属性值选择节点

.net - SQL 集群的 SqlDependency?

c# - HTTP客户端。在自动发现的代理上进行身份验证的默认凭据