Saltar al contenido

Cómo devolver la lista de tipos dinámicos con Dapper ORM

Posteriormente a investigar en diferentes repositorios y foros de internet finalmente descubrimos la respuesta que te enseñamos pronto.

Solución:

¡Por supuesto!

Según la documentación de Dapper, use el método de consulta y obtenga su dinámica:

dynamic account = conn.Query(@"
                    SELECT Name, Address, Country
                    FROM Account
            WHERE Id = @Id", new  Id = Id ).FirstOrDefault();
Console.WriteLine(account.Name);
Console.WriteLine(account.Address);
Console.WriteLine(account.Country);

Como puede ver, obtiene un objeto dinámico y puede acceder a sus propiedades siempre que estén bien definidas en la instrucción de consulta.

si omites .FirstOrDefault() obtienes un IEnumerable que puedes hacer lo que quieras con él.

los DapperRow El objeto está diseñado para compartir mucho estado entre filas. Por ejemplo, si obtiene 40 filas, los nombres de las columnas, etc., solo se almacenan una vez. si usáramos ExpandoObject, esto debería configurarse por fila. Por lo tanto, el uso de DapperRow ya que el detalle de implementación detrás de escena es una cuestión de eficiencia deliberada.

Tenga en cuenta que el objeto devuelto de la dynamic Las API también se pueden convertir como IDictionary.

No obstante, estaría dispuesto a apoyar otro tipos que admiten este uso de diccionario, de los cuales ExpandoObject es uno. entonces si pudo cambiarse de tal manera que:

var rows = conn.Query(...);

obras. Simplemente requiere código para apoyo y ese código no existe actualmente. Así que “no, pero tal vez en una versión futura”.

Tenga en cuenta también que no necesita usar DapperRow en absoluto… Cuanto más esperado escenario es utilizar la API genérica para materializar sus propios tipos.

¡Tengo este problema y lo resolví de esta manera!

los Query() función devuelve una colección de dinámicas que debajo son en realidad Dapper.SqlMapper.DapperRow tipos de objetos los Dapper.SqlMapper.DapperRow es privado. Necesitaba agregar dinámicamente propiedades a los objetos Dapper.SqlMapper.DapperRow, pero eso no parece funcionar. Como resultado, quería convertir el Dapper.SqlMapper.DapperRow en una ExpandoObject.

Pude construir este método auxiliar genérico como se muestra a continuación.

public class DapperHelpers

     public static dynamic ToExpandoObject(object value)
     
         IDictionary dapperRowProperties = value as IDictionary;

         IDictionary expando = new ExpandoObject();

         foreach (KeyValuePair property in dapperRowProperties)
             expando.Add(property.Key, property.Value);

         return expando as ExpandoObject;
     

Entonces puedes usarlo así:

IEnumerable result = 
           db.SqlConn.Query(sqlScript)
               .Select(x=> (ExpandoObject)ToExpandoObject(x));

referencia: problemas dapper-dot-net 166

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *