Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.2K
Visualizações
Cómo deserializar una matriz usando Dapper

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?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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.

over 4 years ago · Santiago Trujillo Relatório

0

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.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda