Как динамически создавать аргументы для запроса Dapper
У меня есть словарь значений Eg "Name": "Alex"
Есть ли способ передать это Dapper в качестве аргументов для запроса?
Вот пример, показывающий, что я хочу сделать.
IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
Ответы
Ответ 1
Да:
var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);
Затем перейдите dbArgs
вместо args
:
var stuff = connection.Query<ExtractionRecord>(query, dbArgs);
В качестве альтернативы вы можете написать свой собственный класс, который реализует IDynamicParameters
.
Обратите внимание: если вы начинаете с объекта (обычный подход с dapper), вы также можете использовать этот шаблон с DynamicParameters
в качестве отправной точки:
var dbArgs = new DynamicParameters(templateObject);
Ответ 2
Я знаю, что это старый вопрос (например, 5 лет), но я боролся с тем же. Полный ответ в комментариях к другому ответу, но я подумал, что предлагаю здесь полный пример.
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));
Или, чтобы быть полностью динамическим, вы можете создать такой метод, который будет принимать любую модель, любой запрос и любой набор параметров запроса:
public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
{
IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
return entities;
}
И затем вызвать этот метод:
var results = Get<MyTable>(query, dictionary)