web-dev-qa-db-fra.com

Comment créer des arguments pour une requête Dapper de manière dynamique

J'ai un dictionnaire de valeurs Par exemple "Nom": "Alex"

Existe-t-il un moyen de transmettre cela à Dapper en tant qu’argument pour une requête?

Voici un exemple montrant ce que je veux faire.

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

Oui:

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

Puis passez dbArgs à la place de args:

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

Alternativement, vous pouvez écrire votre propre classe qui implémente IDynamicParameters.

Notez que si vous partez d'un objet (l'approche habituelle avec dapper), vous pouvez également utiliser ce modèle avec DynamicParameters comme point de départ:

var dbArgs = new DynamicParameters(templateObject);
114
Marc Gravell

Je sais que c'est une vieille question (du genre 5 ans) mais je me débattais avec la même chose. La réponse complète se trouve dans les commentaires de l’autre réponse, mais j’aurais pensé offrir un exemple complet ici.

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

Ou, pour être totalement dynamique, vous pouvez créer une méthode comme celle-ci, qui prend n'importe quel modèle, toute requête et tout ensemble de paramètres de requête:

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

Et ensuite appeler cette méthode:

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

On peut aussi utiliser un paramètre ExpandoObject comme paramètre d'une requête, au lieu de la classe DynamicParameters spécifique à Dapper:

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);
0
turdus-merula