Использует ли Dapper нумерованные параметры, такие как в массивном
Использует ли Dapper нумерованные параметры, такие как в массиве (@0, @1,...) в отличие от именованных (@a, @b,...)?
Необходимо создать запрос в виде
//select @0 as val union select @1 union select @2 union select @3 union select @4
//union select @5 union select @6 union select @7 union select @8 union select @9
var sb = new StringBuilder("select @0 as val");
for (int i = 1; i < 10; i++)
{
sb.AppendFormat(" union select @{0}", i);
}
var query = sb.ToString();
//---Dapper = fail
var db = Connection;
var list = db.Query(query, param: new object[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
//---Massive = ok
var db2 = new Massive.DynamicModel(coins);
var list2 = db2.Query(query, args: new object[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
Каковы решения проблемы для Dapper?
1 ответ:
Massive использует позиционные аргументы в своих запросах, но dapper использует именованные. Поэтому в массиве вы можете передавать массивы параметров, такие как:
new int[] {1,2,3}
, а в dapper вам нужно передавать объекты параметров, такие какnew { a = 1, b = 2 }
.Чтобы достичь аналогичного решения с помощью dapper, вы можете создать объект
DynamicParameters
, где вы можете передать свой словарь параметров, где ключ - это имя параметра, а значение-значение параметра, что-то вроде{"0",0}, {"1", 1},
etcВы можете легко превратить массив в словарь с LINQ:
var dictionary = new object[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} .Select((item, ind) => new {ind = ind.ToString(), item}) .ToDictionary(item => item.ind, item => item.item); DynamicParameters p = new DynamicParameters(dictionary); var list = db.Query(query, param: p);