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



我正在尝试编写一个带有 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 Object WHERE in with Azure DocumentDB (CosmosDB) .Net SDK

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

提前感谢。!!

这对我有用,其中@ids是数组类型:

List<long> ids = new List<long>();
ids.Add(712300002201);
ids.Add(712300002234);
string querySql = @"Select * from Employee where  ARRAY_CONTAINS(@ids, Employee.Id )";
QueryDefinition definition = new QueryDefinition(query).WithParameter("@ids", ids);

我猜你的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. )
  3. 使用类似于STRING_SPLITSQL Server 函数的函数,如果 CosmosDB 存在类似的函数 - 即in (select value from STRING_SPLIT(@ids,','))

您是否尝试过研究下面提出的问题。

Azure Cosmos DB SQL API QueryDefinition WHERE IN 的多个参数

我认为 id 被视为单个字符串,因此结果不会返回。

或者,您可以尝试使用 Microsoft.Azure.DocumentDB.Core 包,并使用文档客户端编写 LINQ 查询,如下面的代码片段所示。

using (var client = new DocumentClient(new Uri(CosmosDbEndpoint), PrimaryKeyCosmosDB)){
List<MyClass> obj= client.CreateDocumentQuery<List<MyClass>>(UriFactory.CreateDocumentCollectionUri(databaseName, collectionName))
.Where(r => ids.Contains(r.id))
.AsEnumerable();}

相关内容

最新更新