У меня есть словарь значений, например «Имя»: «Алекс»
Есть ли способ передать это Dapper в качестве аргументов запроса?
Вот пример того, что я хочу сделать.
IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
new DynamicParameters(dictionary)
и он будет работать нормально.Я знаю, что это старый вопрос (например, пятилетний), но я боролся с тем же самым. Полный ответ находится в комментариях к другому ответу, но я подумал, что приведу здесь полный пример.
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 .
источник
Можно также использовать в
ExpandoObject
качестве параметров запроса вместо класса, специфичного для DapperDynamicParameters
: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);
источник