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

问题描述 投票:0回答:3

我正在尝试编写一个包含 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 对象 Azure DocumentDB (CosmosDB) .Net SDK 的位置

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

提前致谢。!!

c# .net azure-cosmosdb asp.net-core-3.1 azure-cosmosdb-sqlapi
3个回答
8
投票

这对我有用,其中

@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);

2
投票

我猜你的

ids
值类似于
"12,42,94,7"
。作为字符串参数
@ids
,表达式
in (@ids)
in ('12,42,94,7'
) 大致相同,如果值为 各个数字
12
42
94,则它将不匹配任何值。 
7
。当您使用简单的连接版本时,含义有所不同 - 即
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,','))

-1
投票

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

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

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

或者,您可以尝试使用 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();}
© www.soinside.com 2019 - 2024. All rights reserved.