2012-05-08 3 views
8

Мне нужно сделать общий регистратор для записи определенных инструкций вставки/обновления, чтобы мои тестеры могли проверить правильность вставленных данных.Есть ли все равно, чтобы выполнить итерацию через объект Dapper DynamicParameters?

Моя первая мысль заключалась в том, что я бы просто использовал функцию, которая принимала DynamicParameters, и я бы предложил через DynamicParameters создать строку, чтобы отобразить имя и значение параметра и сделать их более удобными для чтения для тестеров.

К сожалению, Dapper.DynamicParameters не содержит публичное определение для "GetEnumerator"

Вот простой пример того, что я надеялся сделать:

string myFormattedListofParameters = ""; 
foreach (var p in myDynamicParameters) 
{ 
myFormattedListofParameters += p.Name + "=" + p.Value.ToString(); 
} 

ответ

5

Try:

  var sb = new StringBuilder(); 
      foreach (var name in p.ParameterNames) 
      { 
       var pValue = p.Get<dynamic>(name); 
       sb.AppendFormat("{0}={1}\n", name, pValue.ToString()); 
      } 
+0

Благодарим вас за помощь Сэма. BTW, люблю Dapper, это спасло меня так много времени и головной боли. Когда я пытаюсь выполнить код выше, я получаю ... «Dapper.DynamicParameters» не содержит определения для «ParameterNames». – SLoret

+7

@Sam Saffron Я получаю следующее исключение, когда следую вашему коду: [NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта.] Dapper.DynamicParameters.Get (имя строки) в c: \ Dev \ Dapper \ Dapper \ SqlMapper.cs: 2574 –

+2

Я получаю то же исключение, что и Гэри. Любые обновления по этому вопросу? –

-1

На всякий случай,

var pmaster = new Dapper.DynamicParameters();        
SortedList l = new SortedList(); 
l.Add("param1", object1); 
l.Add("param2", object2); 
l.Add("param3", object3); 
l.Add("param4", object4); 

foreach(var key in l.Keys) 
{ 
    var val = l[key]; 
    pmaster.Add(key.ToString(), val); 
} 

Работал для меня.

+0

Это не поможет в ситуациях, когда я хочу инкапсулировать абстракцию. Если бы мне пришлось применить это в методе FormatDynamicParameters, теперь я бы потребовал, чтобы все мои потребители передали экземпляр DynamicParameters и реализацию IList. –

5
string ParametersToString(DynamicParameters parameters) 
    { 
     var result = new StringBuilder(); 

     if (parameters != null) 
     { 
      var firstParam = true; 
      var parametersLookup = (SqlMapper.IParameterLookup)parameters; 
      foreach (var paramName in parameters.ParameterNames) 
      { 
       if (!firstParam) 
       { 
        result.Append(", "); 
       } 
       firstParam = false; 

       result.Append('@'); 
       result.Append(paramName); 
       result.Append(" = "); 
       try 
       { 
        var value = parametersLookup[paramName];// parameters.Get<dynamic>(paramName); 
        result.Append((value != null) ? value.ToString() : "{null}"); 
       } 
       catch 
       { 
        result.Append("unknown"); 
       } 
      } 

     } 
     return result.ToString(); 
    } 
+0

Приведение в SqlMapper.IParameterLookup помогло мне избежать исключения NullReferenceException, которое я получал при попытке выполнить итерацию коллекции до использования в экземпляре IDbConnection. Благодаря! –

+0

Годы спустя - это решило это. –

+0

Спасибо за это, помогли при написании модульных тестов, которые утверждали правильные параметры, когда они были подключены к правильным значениям в вызовах нашей обертки Dapper – nrjohnstone