Come limitare i parametri passati usando il costruttore DynamicParameter di Dapper

asp.net c# dapper

Domanda

Utilizzando il costruttore Dapper DynamicParameters, esiste un modo per escludere determinati parametri dall'essere inclusi. Ad esempio, supponiamo di avere la seguente entità,

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

e sto chiamando una procedura memorizzata che ha solo Method1 e Method2 come parametri, posso avere il metodo DynamicParameters solo passare quei due parametri e saltare il terzo parametro? Per il mio esempio dal vivo, ho molte più proprietà per la mia entità e preferisco usare uno scenario di esclusione piuttosto che specificare il parametro a mano.

Risposta accettata

L'opzione più semplice è una proiezione anonima: può essere eseguita sia per l'oggetto argomento stesso, sia per il parametro su DynamicParameters se è necessario aggiungere ulteriori parametri personalizzati; per esempio:

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

Risposta popolare

È possibile utilizzare un metodo di estensione come il seguente per generare parametri dinamici. In un caso come il mio, dove ho un gran numero di parametri, si risparmia un po 'di tempo.

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché