简洁的动态参数字典值

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

我在项目中使用 dapper 来调用存储过程。我在我的 api 中设置了以下 post 调用

  [HttpPost("{procName}")]
  public List<dynamic> RunProcWithParameters(string procName, [FromQuery]Dictionary<string, string> procParameters)
  {    
      var parameters = new DynamicParameters(procParameters);
      using var conn = new SqlConnection(_options.Connection);


      var result =  conn.Query(procName, parameters, commandType: CommandType.StoredProcedure).ToList();

      return result;
  }

在我的项目中连接 swagger 后,我正在通过传入我的过程名称和参数以及示例调用来测试我的 API,如下所示: https://localhost:7009/StoredProc/MyProcThatIWantToRun?ParameterName=ParameterValue

当我运行此程序时,出现以下错误:

类型的成员Comparer System.Collections.Generic.IEqualityComparer`1[[System.String, System.Private.CoreLib,版本=6.0.0.0,文化=中性, PublicKeyToken=7cec85d7bea7798e]] 不能作为参数值

我尝试将字典更改为Dictionary,但是当我运行此命令时没有传递任何值。

我在这方面做错/不理解是什么?

c# api .net-core dapper
1个回答
0
投票

看来字典值到 DynamicParameters 的转换是问题的根源。使用 DynamicParameters 时,会尝试在内部使用 DictionaryStringObjectComparer 进行比较。从错误来看,该比较器不适合您的情况。

您可能需要使用 DynamicParameters 循环浏览字典并一次添加每个参数,而不是一次提供完整的字典作为参数。确保 URL 中的参数也与您保存的方法中预期的参数名称相对应。

[HttpPost("{procName}")]
public List<dynamic> RunProcWithParameters(string procName, [FromQuery] 
Dictionary<string, string> procParameters)
{    
var parameters = new DynamicParameters();

// Iterate through the dictionary and add each parameter individually
foreach (var kvp in procParameters)
{
    parameters.Add(kvp.Key, kvp.Value);
}

using var conn = new SqlConnection(_options.Connection);

var result =  conn.Query(procName, parameters, commandType: CommandType.StoredProcedure).ToList();

return result;
}

通过此更改,您可以放心,每个参数都会单独添加到 DynamicParameters 中。此外,请确认值的类型正确,并且 URL 中的参数名称与存储方法的预期参数名称相对应。

© www.soinside.com 2019 - 2024. All rights reserved.