我正在使用新的 Cosmos DB SDK for .NET 创建 Cosmos DB 客户端的包装器。
在此示例中,我了解如何向查询添加单个参数:https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/quickstart-dotnet?pivots=devcontainer-codespace#查询项目
在我的通用包装方法中,我可能会获得多个参数,或者根本没有参数。我没有看到用于在定义查询后向查询添加参数的
Add()
选项。如何向 Cosmos DB 查询添加多个参数?
这是我的通用包装方法:
public async Task<IEnumerable<T>> ReadQuery<T>(string sql, Dictionary<string, object> parameters)
{
var query = new Query(sql);
if(parameters != null && parameters.Count > 0)
foreach(var item in parameters)
??? // How do I add parameters to my query here?
using FeedIterator<T> feed = container.GetItemQueryIterator<T>(
queryDefinition: query
);
}
要使用新的 .NET SDK 向 Cosmos DB 查询添加多个参数,可以使用 QueryDefinition.WithParameter() 方法,该方法允许您一一添加查询参数。
由于您正在使用通用包装方法,并且希望能够灵活地处理多个参数(或无参数),因此您可以迭代一组参数并将每个参数应用到 QueryDefinition。
以下是修改通用包装方法以处理多个参数的方法:
步骤: 准备一个字典(或任何键值集合),其中键代表参数名称,值是对应的参数值。 迭代此集合并使用 WithParameter() 将每个参数添加到查询中。 这是通用包装方法的示例实现:
using Microsoft.Azure.Cosmos;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class CosmosDbWrapper
{
private
readonly Container _container;
public CosmosDbWrapper(Container container)
{
_container = container;
}
public async Task<List<T>> QueryItemsAsync<T>(string queryText, Dictionary<string, object> parameters = null)
{
QueryDefinition queryDefinition = new QueryDefinition(queryText);
if (parameters != null)
{
foreach (var parameter in parameters)
{
queryDefinition.WithParameter(parameter.Key, parameter.Value);
}
}
List<T> results = new List<T>();
using (FeedIterator<T> resultSetIterator = _container.GetItemQueryIterator<T>(queryDefinition))
{
while (resultSetIterator.HasMoreResults)
{
FeedResponse<T> response = await resultSetIterator.ReadNextAsync();
foreach (T item in response)
{
results.Add(item);
}
}
}
return results;
}
}