Comment limiter les paramètres transmis à l'aide du constructeur DynamicParameter de Dapper

asp.net c# dapper

Question

L'utilisation du constructeur Dapper DynamicParameters permet d'exclure certains paramètres. Par exemple, disons que j'ai l'entité suivante,

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

et j'appelle une procédure stockée qui a seulement les méthodes Method1 et Method2, puis-je avoir la méthode DynamicParameters seulement passer ces deux paramètres et ignorer le troisième paramètre? Pour mon exemple réel, j'ai beaucoup plus de propriétés pour mon entité et préfère utiliser un scénario d'exclusion que de spécifier le paramètre manuellement.

Réponse acceptée

L'option la plus simple est une projection anonyme - cela peut être fait pour l'objet argument lui-même ou pour le paramètre DynamicParameters si vous devez ajouter des paramètres personnalisés supplémentaires. par exemple:

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

ou:

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

Réponse populaire

Vous pouvez utiliser une méthode d'extension comme celle-ci pour générer des paramètres dynamiques. Dans un cas comme le mien, où j'ai un grand nombre de paramètres, cela fait gagner un peu de temps.

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi