You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将foreach循环生成的Azure Cosmos DB SQL-API语句转换为参数化语句

实现方案

注意事项

  • Cosmos DB 仅支持对查询值做参数化,属性路径(比如示例中c.indexData[]内的键名)无法参数化,这部分如果是用户可控输入,提前做好字符范围校验(比如限制仅允许字母、数字、常规符号,避免注入风险)即可。
  • 参数化查询不需要为参数值额外加单引号,也不要把参数值直接拼接进SQL语句文本。

完整实现代码

using Microsoft.Azure.Cosmos;
using System.Text;

// 你的原始数据
var searchDictionary = new Dictionary<string, string>();
searchDictionary.Add("Name", "Bob");
searchDictionary.Add("Surname", "Builder");
var Institiute = "test";

// 初始化SQL语句拼接和参数容器
StringBuilder sqlBuilder = new StringBuilder("SELECT TOP 100 * FROM c WHERE c.college = @Institute");
QueryDefinition queryDefinition = new QueryDefinition(sqlBuilder.ToString());
// 先添加固定参数
queryDefinition.WithParameter("@Institute", Institiute);

// 循环处理字典里的键值对,此处如果你的数据源是request.IndexData直接替换即可
int paramIndex = 0;
foreach (var item in searchDictionary)
{
    // 为每个值生成唯一参数名
    string paramName = $"@IndexVal_{paramIndex}";
    // 拼接查询条件,键名直接拼接(提前做好校验),值用参数占位
    sqlBuilder.Append($" AND c.indexData['{item.Key}'] = {paramName}");
    // 给QueryDefinition添加对应参数
    queryDefinition.WithParameter(paramName, item.Value);
    paramIndex++;
}

// 更新QueryDefinition的查询文本
queryDefinition.QueryText = sqlBuilder.ToString();

// 后续正常用这个queryDefinition执行查询即可,示例:
// var container = cosmosClient.GetDatabase("你的库名").GetContainer("你的容器名");
// using var queryIterator = container.GetItemQueryIterator<你的模型类>(queryDefinition);
// while (queryIterator.HasMoreResults)
// {
//     var result = await queryIterator.ReadNextAsync();
//     // 处理结果
// }

内容的提问来源于stack exchange,提问作者Elpappie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 06:18:01