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