Cómo limitar los parámetros pasados ​​usando el constructor DynamicParameter de Dapper

asp.net c# dapper

Pregunta

Al usar el constructor Dapper DynamicParameters, hay una forma de excluir ciertos parámetros de ser incluidos. Por ejemplo, digamos que tengo la siguiente entidad,

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

y estoy llamando a un procedimiento almacenado que solo tiene Method1 y Method2 como parámetros, ¿puedo hacer que el método DynamicParameters pase solo esos dos parámetros y omita el tercer parámetro? Para mi ejemplo en vivo, tengo muchas más propiedades para mi entidad y preferiría usar un escenario de exclusión que especificar el parámetro a mano.

Respuesta aceptada

La opción más simple aquí es una proyección anónima: esto se puede hacer para el objeto de argumento en sí o para el parámetro de DynamicParameters si necesita agregar parámetros personalizados adicionales; por ejemplo:

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

o:

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

Respuesta popular

Puede usar un método de extensión como el siguiente para generar parámetros dinámicos. En un caso como el mío, donde tengo una gran cantidad de parámetros, ahorra un poco de tiempo.

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);
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué