Cómo mapear a un objeto de diccionario a partir de los resultados de la base de datos utilizando Dapper Dot Net?

asp.net c# dapper

Pregunta

Si tengo una consulta simple como:

string sql = "SELECT UniqueString, ID  FROM Table";

y quiero asignarlo a un objeto de diccionario como:

Dictionary<string, int> myDictionary = new Dictionary<string, int>();      

¿Cómo haría esto con Dapper?

Supongo que es algo así como:

myDictionary = conn.Query<string, int>(sql, new {  }).ToDictionary();

Pero no puede descifrar la sintaxis adecuada.

Respuesta aceptada

Ya se han mostrado varias maneras; personalmente solo usaría la API no genérica:

var dict = conn.Query(sql, args).ToDictionary(
    row => (string)row.UniqueString,
    row => (int)row.Id);

Respuesta popular

Funciona también sin una clase adicional:

var myDictionary = conn.Query<string, int, KeyValuePair<string,int>>(sql, (s,i) => new KeyValuePair<string, int>(s,i))
    .ToDictionary(kv => kv.Key, kv => kv.Value);

NOTA : Al usar la versión Dapper.NET 3.5, el método Query que toma los tipos primero, segundo y de retorno requiere que especifique más parámetros, ya que las versiones .NET 4.0 y .NET 4.5 aprovechan los argumentos opcionales .

En este caso, el siguiente código debería funcionar:

string splitOn = "TheNameOfTheValueColumn";
var myDictionary = conn.Query<string, int, KeyValuePair<string,int>>(sql, (s,i) => new KeyValuePair<string, int>(s,i), null, null, false, splitOn, null, null)
        .ToDictionary(kv => kv.Key, kv => kv.Value);

La mayoría de los argumentos volverán a ser los predeterminados, pero se requiere splitOn , ya que de lo contrario se establecerá de manera predeterminada en un valor de 'id'.

Para una consulta que devuelve dos columnas, ' ID ' y ' Descripción ', splitOn debe establecerse en ' Descripción '.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow