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