Wie man Parameter beschränkt, die mit dem DynamicParameter-Konstruktor von Dapper übergeben werden

asp.net c# dapper

Frage

Mit dem Dapper DynamicParameters-Konstruktor können bestimmte Parameter ausgeschlossen werden. Angenommen, ich habe die folgende Entität:

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

Und ich rufe eine gespeicherte Prozedur auf, die nur Method1 und Method2 als Parameter hat. Kann ich die DynamicParameters-Methode nur diese beiden Parameter übergeben und den dritten Parameter überspringen? Für mein Live-Beispiel habe ich viel mehr Eigenschaften für meine Entität und würde lieber ein Ausschluss-Szenario verwenden, als den Parameter manuell festzulegen.

Akzeptierte Antwort

Die einfachste Option ist eine anonyme Projektion - dies kann entweder für das Argumentobjekt selbst oder für den Parameter DynamicParameters wenn Sie zusätzliche benutzerdefinierte Parameter hinzufügen müssen. beispielsweise:

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

oder:

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

Beliebte Antwort

Sie können eine Erweiterungsmethode wie die folgende verwenden, um dynamische Parameter zu generieren. In einem Fall wie meins, wo ich eine große Anzahl von Parametern habe, spart es ein wenig Zeit.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum