So erstellen Sie dynamisch Argumente für eine Dapper-Abfrage

86

Ich habe ein Wertewörterbuch, zB "Name": "Alex"

Gibt es eine Möglichkeit, dies als Argumente für eine Abfrage an Dapper zu übergeben?

Hier ist ein Beispiel, das zeigt, was ich tun möchte.

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

Antworten:

140

Ja:

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

Dann übergeben Sie dbArgsanstelle von args:

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

Alternativ können Sie Ihre eigene Klasse schreiben, die implementiert IDynamicParameters.

Beachten Sie, dass Sie diese Vorlage auch DynamicParametersals Ausgangspunkt verwenden können, wenn Sie von einem Objekt ausgehen (der übliche Ansatz mit Dapper) :

var dbArgs = new DynamicParameters(templateObject);
Marc Gravell
quelle
25
Beachten Sie, dass Sie dies tun können new DynamicParameters(dictionary)und es gut funktioniert.
Asgerhallas
1
@asgerhallas, die im Februar vielleicht nicht wahr waren, aber ja: Sie haben Recht - das ist jetzt sicher wahr
Marc Gravell
10
Damit neue DynamicParameters (Wörterbuch) funktionieren, muss das Wörterbuch ein IEnumerable <KeyValuePair <Zeichenfolge, Objekt >> sein, z. B. Dictionary <Zeichenfolge, Objekt>. Das Wörterbuch <string, string> hat nicht funktioniert.
Zar Shardan
17

Ich weiß, dass dies eine alte Frage ist (etwa 5 Jahre alt), aber ich hatte mit der gleichen Sache zu kämpfen. Die vollständige Antwort finden Sie in den Kommentaren zur anderen Antwort, aber ich dachte, ich würde hier ein vollständiges Beispiel anbieten.

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

Um vollständig dynamisch zu sein, können Sie eine Methode wie diese erstellen, die jedes Modell, jede Abfrage und jeden Satz von Abfrageparametern akzeptiert:

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

Und dann, um diese Methode aufzurufen:

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

LANG NACH BEARBEITEN

Diese Antwort erhält weiterhin positive Stimmen, daher ist dies anscheinend immer noch ein Bedürfnis. Ich habe diese Lösung genommen und ein komplettes NuGet-Paket für den Datenzugriff erstellt, das auf Dapper basiert. Es reduziert Ihre CRUD- und Abfrageoperationen auf eine einzige Codezeile.

Hier ist das NuGet-Paket .

Casey Crookston
quelle
0

ExpandoObjectAnstelle der Dapper-spezifischen Klasse kann auch a als Parameter einer Abfrage verwendet werden 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);
Turdus-Merula
quelle