如何限制使用Dapper的DynamicParameter构造函数传递的参数

时间:2013-07-04 18:17:31

标签: c# asp.net dapper

使用Dapper DynamicParameters构造函数,有没有办法排除某些参数被包含在内。例如,假设我有以下实体,

public class EntityA
{
    public string Method1 { get; set; }
    public string Method2 { get; set; }
    public string Method3 { get; set; }
}

我正在调用一个只有Method1和Method2作为参数的存储过程,我可以让DynamicParameters方法只传递这两个参数并跳过第三个参数吗?对于我的实例,我的实体有很多属性,宁愿使用排除场景而不是手动指定参数。

2 个答案:

答案 0 :(得分:1)

这里最简单的选项是匿名投影 - 如果需要添加其他自定义参数,可以对参数对象本身或DynamicParameters参数执行此操作;例如:

conn.Execute(sql, new { obj.Foo, obj.Bar });

或:

var args = new DynamicParameters(new { obj.Foo, obj.Bar });
// not shown: add some more custom parameters
conn.Execute(sql, args);

答案 1 :(得分:0)

您可以使用如下所示的扩展方法生成动态参数。在像我这样的情况下,我有大量参数,节省了一点时间。

public static class ParameterExtensions
{
    public static DynamicParameters ConvertToDynamicParameters<T>(this T incoming)
    {
      DynamicParameters dynamicParameters = new DynamicParameters();
      foreach (PropertyInfo property in incoming.GetType().GetProperties())
      {
        object value = GetPropValue(incoming, property.Name);
        if (value != null) dynamicParameters.Add(property.Name, value);
      }
      return dynamicParameters;
    }

    private static object GetPropValue(object src, string propName)
    {
      return src.GetType().GetProperty(propName)?.GetValue(src, null);
    }
}