Tengo un modelo que tiene un HashSet<int> . Como no pude hacer que Dapper creara automáticamente el conjunto a partir de una matriz, pensé que simplemente usaría una consulta de mapeo múltiple y obtendría la matriz como una columna separada, la dividiría y crearía el conjunto dentro de una lambda. Para que quede claro, quiero deserializar todo el modelo, no solo la parte del conjunto.
Mi primer intento de mapeo múltiple también falló, así que decidí probar algo más simple, obtener una matriz y deserializarla en List<int> o int[] . Y aquí es donde estoy atascado.
Estoy usando una base de datos PostgreSQL 12.
El fragmento de código es el siguiente
var query = "SELECT ARRAY[1, 2, 3];"; var ints1 = await _conn.QueryAsync<List<int>>(query); // This returns an empty array var ints2 = await _conn.QueryAsync<int[]>(query); // System.ArgumentException: Invalid type owner for DynamicMethod.No estoy muy seguro de lo que estoy haciendo mal y Google realmente no parece ayudar, solo encuentro preguntas sobre el uso de listas en las consultas.
Editar: Ok, lo hice funcionar convirtiendo la matriz en un JSON, pero todavía encuentro fea esta solución. ¿Hay alguna forma de evitar la creación de JSON?
No crea todo lo que escucha, aunque se indicó anteriormente que no es posible, en realidad es fácilmente alcanzable.
Es cierto que la consulta a continuación le dará un error: (Propietario de tipo no válido para DynamicMethod):
var arrayOfThreeElements = (await _conn.QueryAsync<int[]>("SELECT ARRAY[1, 2, 3]")) .FirstOrDefault();Lo que debe hacer es decirle a Dapper cómo manejar esto usando un TypeHandler pequeño:
public class GenericArrayHandler<T> : SqlMapper.TypeHandler<T[]> { public override void SetValue(IDbDataParameter parameter, T[] value) { parameter.Value = value; } public override T[] Parse(object value) => (T[]) value; }El método Parse es el importante aquí.
Luego, solo agrega este controlador donde ha agregado todos sus otros controladores de tipos, es decir, en el código de inicialización de su aplicación o sitio web de esta manera:
SqlMapper.AddTypeHandler(new GenericArrayHandler<int>());Ahora la consulta funciona y devuelve los 3 elementos, 1,2 y 3 en una matriz de enteros.
La respuesta está en los comentarios, pero TL; DR esto no se puede hacer. La matriz debe convertirse en una cadena y luego deserializarse en la lista.
Estoy respondiendo a esta pregunta en lugar de cerrarla, ya que creo que es una pregunta válida si ha usado principalmente Postgres y tal vez espera que las matrices sean una cosa en otros RDMS.