Come creare dinamicamente argomenti per una query Dapper


88

Ho un dizionario di valori Es. "Nome": "Alex"

C'è un modo per passarlo a Dapper come argomenti per una query?

Ecco un esempio che mostra cosa voglio fare.

IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);

Risposte:


144

Sì:

var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);

Quindi passare dbArgsal posto di args:

var stuff = connection.Query<ExtractionRecord>(query, dbArgs);

In alternativa, puoi scrivere la tua classe che implementa IDynamicParameters .

Nota che se stai partendo da un oggetto (il solito approccio con dapper), puoi anche usare questo modello con DynamicParameterscome punto di partenza:

var dbArgs = new DynamicParameters(templateObject);

25
Nota che puoi farlo new DynamicParameters(dictionary)e funzionerà benissimo.
asgerhallas

1
@asgerhallas che potrebbe non essere vero a febbraio, ma sì: hai ragione - questo è certamente vero ora
Marc Gravell

11
Affinché i nuovi DynamicParameters (dizionario) funzionino, il dizionario deve essere un IEnumerable <KeyValuePair <stringa, oggetto >>, ad esempio Dictionary <stringa, oggetto>. Il dizionario <stringa, stringa> non ha funzionato.
Zar Shardan

17

So che questa è una vecchia domanda (tipo, 5 anni) ma stavo lottando con la stessa cosa. La risposta completa è nei commenti all'altra risposta, ma ho pensato di offrire un esempio completo qui.

string query = "SELECT * FROM MyTableName WHERE Foo = @Foo AND Bar = @Bar";

Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("@Foo", "foo");
dictionary.Add("@Bar", "bar");

var results = connection.Query<MyTableName>(query, new DynamicParameters(dictionary));

Oppure, per essere completamente dinamico, puoi creare un metodo come questo, che accetta qualsiasi modello, qualsiasi query e qualsiasi set di parametri di query:

    public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
    {
        IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
        return entities;
    }

E poi per chiamare questo metodo:

var results = Get<MyTable>(query, dictionary)

MODIFICA LUNGO DOPO

Questa risposta continua a ricevere voti positivi, quindi a quanto pare è ancora una necessità. Ho preso questa soluzione e ho creato un intero pacchetto NuGet per l'accesso ai dati basato su Dapper. Riduce il CRUD e le operazioni di query a una singola riga di codice.

Ecco il pacchetto NuGet .


1

Si può anche usare un ExpandoObjectcome parametri di una query, invece della classe specifica di Dapper DynamicParameters:

ExpandoObject param = new ExpandoObject();

IDictionary<string, object> paramAsDict = param as IDictionary<string, object>;
paramAsDict.Add("foo", 42);
paramAsDict.Add("bar", "test");

MyRecord stuff = connection.Query<MyRecord>(query, param);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.