首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数化的Where子句不适用于CosmosClient QueryDefinition对象

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

Stack Overflow用户
提问于 2022-01-27 12:22:21
回答 3查看 1.3K关注 0票数 3

我正在尝试编写一个参数化查询,其中包含IN子句.

代表:

工作代码

输入字符串:“指南1”、“指南2”、“guid3”

代码语言:javascript
复制
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;
}

结果:返回预期的结果。

非工作代码

输入字符串:“指南1”、“指南2”、“guid3”

代码语言:javascript
复制
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

在这方面的任何帮助都是非常感谢的。

提前谢谢!

EN

回答 3

Stack Overflow用户

发布于 2022-01-27 12:39:02

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

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

params int[] ids)

  • use

  • 使用多个参数,每个值一个,即以带有4个参数值的in (@ids0, @ids1, @ids2, @ids3)结束(通过在C#代码中拆分字符串,或者使用不同的参数类型-如果CosmosDB中存在类似于STRING_SPLIT Server函数的函数,则使用不同的参数类型-即in (select value from STRING_SPLIT(@ids,','))

)。

票数 2
EN

Stack Overflow用户

发布于 2022-05-31 21:24:55

这对我来说很有用,其中@ids是一个数组类型:

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2022-01-27 13:00:49

你试过调查下面的问题了吗?

Azure Cosmos DB SQL API QueryDefinition multiple parameters for WHERE IN

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

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

代码语言:javascript
复制
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();}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70878491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档