Как динамически создавать аргументы для запроса Dapper

86

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

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

Вот пример того, что я хочу сделать.

IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
Cogslave
источник

Ответы:

140

Да:

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);
Марк Гравелл
источник
25
Обратите внимание, что вы можете это сделать, new DynamicParameters(dictionary)и он будет работать нормально.
asgerhallas 05
1
@asgerhallas, что могло не быть правдой в феврале, но да: вы правы - это определенно верно сейчас
Марк Грейвелл
10
для того, чтобы новый DynamicParameters (словарь) работал, словарь должен быть IEnumerable <KeyValuePair <string, object >>, например Dictionary <string, object>. Словарь <строка, строка> не работал.
Zar Shardan
17

Я знаю, что это старый вопрос (например, пятилетний), но я боролся с тем же самым. Полный ответ находится в комментариях к другому ответу, но я подумал, что приведу здесь полный пример.

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)

ИЗМЕНИТЬ ПОСЛЕ

Этот ответ продолжает получать положительные голоса, так что, по-видимому, это все еще необходимо. Я взял это решение и создал полный пакет NuGet для доступа к данным, построенный на основе Dapper. Он сводит ваши CRUD-операции и операции запросов к одной строке кода.

Вот пакет NuGet .

Кейси Крукстон
источник
0

Можно также использовать в ExpandoObjectкачестве параметров запроса вместо класса, специфичного для Dapper 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
источник