Процедурно создать динамический объект для Dapper

ado.net c# dapper sql-server tsql

Вопрос

Я видел много сообщений о создании объектов ExpandoObject и т. Д., Но в моем случае это не работает. Мне нужно создать такой объект, как

var someObj = new {
    term1 = "someValue",
    term2 = "other",
    ...
};

В принципе, мы используем Dapper и нам нужно динамически создавать запрос, где WHERE сфабриковано из заданного массива аргументов. Мы не обобщаем запросы! Это единственный метод, получающий переменное количество аргументов, и нам нужно проверить OR каждое значение в одном столбце.

В настоящее время единственным жизнеспособным решением является возврат и прямое использование System.Data.SqlClient.SqlConnection , или есть ли способ сделать эту работу?

Обновить:

Это то, что, скорее всего, должно работать, но не делает:

string inWhere = null;
dynamic inTerms = new ExpandoObject();
IDictionary<string, object> inTermsDict = inTerms;

if (!(string.IsNullOrEmpty(filter.Term) || string.IsNullOrWhiteSpace(filter.Term))) {
    inWhere = "(" + string.Join(" OR ", filter.Terms.Select((t, i) => "{0} LIKE @p" + i)) + ")";
    int termIndex = 0;
    foreach (string term in filter.Terms) {
        inTermsDict.Add("p" + (termIndex++), term);
    }
}

// ...

var rows = db.Query("SELECT * FROM {table} WHERE {baseCondition}" +
     (string.IsNullOrEmpty(inWhere) ? "" : string.Format(" AND " + inWhere, "columnName")),
     inTerms as object);

Принятый ответ

Чтобы ответить на мой собственный вопрос, мы нашли правильное решение сегодня.

Проще говоря, мы нашли IDynamicParameters И этот класс просто решает все, действуя как Dictionary .

var inTerms = new Dapper.DynamicParameters();

inTerms.Add("@p" + (termIndex++), somveValue);

Все счастливы!



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему