¿Dapper usa parámetros numerados como en Massive?

dapper massive sql-server

Pregunta

¿Dapper usa parámetros numerados como Massive (@ 0, @ 1, ...) a diferencia de named (@a, @b, ...)?

Es necesario crear una consulta como

//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 });

¿Cuáles son las soluciones al problema para Dapper?

Respuesta aceptada

Massive usa argumentos posicionales en sus consultas pero dapper usa los nombrados. Por lo tanto, en grandes cantidades puede pasar matrices de parámetros como: new int[] {1,2,3} mientras que en dapper necesita pasar objetos de parámetros como new { a = 1, b = 2 } .

Para lograr una solución similar con dapper, puede crear un objeto DynamicParameters donde puede pasar su diccionario de parámetros donde la clave es el nombre del parámetro y el valor es el valor del parámetro, algo así como {"0",0}, {"1", 1}, etc.

Puede convertir fácilmente una matriz en un diccionario con 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);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué