2013-03-18 2 views
4

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

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

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

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

Update:

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

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

Вы имеете в виду 'ExpandoObject'? Пожалуйста, напишите, как вы собираетесь называть эту процедуру, потому что я не видел ничего процедурного в ваших примерах. –

+0

Очень хорошо, я добавляю дополнительную информацию ... –

ответ

6

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

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

var inTerms = new Dapper.DynamicParameters(); 

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

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

+2

Для информации вы можете комбинировать и подбирать подходы здесь; вы также можете * инициализировать * DynamicParameters' с помощью обычного объекта, а затем добавить любые дополнительные свойства, которые вам нужны. Значение: вам не нужно вручную добавлять * каждое * свойство –

+0

Спасибо за информацию. Таким образом, объект, переданный конструктору, будет действовать как базовые параметры, как я понимаю. Нам пока не нужна эта функция, но это хорошо знать. –

+2

Это позволило мне использовать Dapper в плане хостинга со средним доверием, так как кажется, что для использования анонимного объекта для параметров требуется Reflection.Emit, который не разрешен по среднему доверию. –

Смежные вопросы