向 Cosmos DB 查询添加多个参数

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

我正在使用新的 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
    );
}
azure-cosmosdb azure-cosmosdb-sqlapi
1个回答
0
投票

要使用新的 .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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.