2012-02-28 2 views
60

У меня есть словарь значений, например, «Имя»: «Алекс»Как создать аргументы для Dapper запроса динамически

Есть ли способ, чтобы передать это Dapper в качестве аргументов для запроса?

Вот пример, показывающий, что я хочу делать.

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

ответ

99

Да:

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

Обратите внимание, что вы можете использовать 'new DynamicParameters (dictionary)', и он будет работать нормально. – asgerhallas

+0

@asgerhallas, который, возможно, не был прав в феврале, но да: вы правы - это, безусловно, верно сейчас –

+7

, чтобы работать с новыми динамическими параметрами (словарь), словарь должен быть IEnumerable > , например Dictionary . Словарь <строка, строка> не работает. –

3

Я знаю, что это старый вопрос (например, , 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) 
Смежные вопросы