我正在尝试编写一个参数化查询,其中包含IN子句.。
代表:
工作代码
输入字符串:“指南1”、“指南2”、“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;
}结果:返回预期的结果。
非工作代码
输入字符串:“指南1”、“指南2”、“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
在这方面的任何帮助都是非常感谢的。
提前谢谢!
发布于 2022-01-27 12:39:02
我猜您的ids值类似于"12,42,94,7"。作为字符串参数@ids,表达式in (@ids)与in ('12,42,94,7')大致相同,如果值是单个数字12、42、94和7,则不匹配任何值。当您使用简单的contatenated版本时,含义是不同的--即in (12,42,94,7) (注意缺少引号),它是4个整数值,而不是一个字符串值。
基本上:当参数化时,您需要
params int[] ids)
in (@ids0, @ids1, @ids2, @ids3)结束(通过在C#代码中拆分字符串,或者使用不同的参数类型-如果CosmosDB中存在类似于STRING_SPLIT Server函数的函数,则使用不同的参数类型-即in (select value from STRING_SPLIT(@ids,',')))。
发布于 2022-05-31 21:24:55
这对我来说很有用,其中@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);发布于 2022-01-27 13:00:49
你试过调查下面的问题了吗?
Azure Cosmos DB SQL API QueryDefinition multiple parameters for 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();}https://stackoverflow.com/questions/70878491
复制相似问题