Як динамічно створювати аргументи для запиту Dapper


86

У мене є словник значень, наприклад "Ім'я": "Олексій"

Чи є спосіб передати це Dapper як аргументи для запиту?

Ось приклад, що показує, чим я хочу займатися.

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

Відповіді:


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

1
@asgerhallas, що, можливо, не було правдою в лютому, але так: ви маєте рацію - це, звичайно, правда зараз
Марк Гравелл

10
для того, щоб нові DynamicParameters (словник) працювали, словником повинен бути IEnumerable <KeyValuePair <рядок, об'єкт >>, наприклад Dictionary <рядок, об'єкт>. Словник <рядок, рядок> не працював.
Zar Shardan

17

Я знаю, що це старе запитання (наприклад, 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)

РЕДАГУВАТИ ДОВГО ПІСЛЯ

Ця відповідь продовжує отримувати голоси, тому, мабуть, це все ще є необхідністю. Я взяв це рішення і створив цілий пакет доступу до даних NuGet, побудований поверх Dapper. Це зменшує ваші CRUD та операції запиту до одного рядка коду.

Ось пакет NuGet .


0

Можна також використовувати a 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.