如何将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
相关产品推荐
相关产品推荐

