Crear instancias de objetos anónimos usando Dapper

.net c# dapper orm

Pregunta

Estoy en el proceso de aprender Dapper y tengo problemas para crear instancias de tipos anónimos con él. Antes que nada, contexto: tenemos un método que devuelve un IEnumerable<T> . Tenga en cuenta que T puede ser anónimo.

IEnumerable<T> ExecuteCollection<T>(...)
{
    // Query building logic goes here.

    var statement = Something.Statement;
    var parameters = Something.Parameters;

    return _connection.Query<T>(statement, parameters);
}

Este código funciona para clases registradas como un encanto. Sin embargo, también quiero que maneje tipos anónimos, y el problema que plantea el compilador es:

InvalidOperationException: "A parameterless default constructor or one matching signature ([signature of anonymous object]) is required for <>f__AnonymousType5`2[[System.Int16, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=XXX],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=XXX]] materialization"

Sé que el problema es el hecho de que los objetos anónimos no tienen constructores con los que trabajar. Una alternativa a eso sería (T)Activator.CreateInstance(typeof(T), row) , pero la variable de la row debe ser un object[] , no un DapperRow .

Cada vez que buscaba información sobre este tema, todos decían que, para empezar, no debería trabajar con tipos anónimos. Sin embargo, se requiere que mi función devuelva una colección de elementos de tipo anónimos.

Esta es la primera vez que uso Dapper, y no sé si estoy entendiendo mal o no. La pregunta es: ¿cómo puedo crear una instancia de un objeto anónimo con Dapper, o cuál es la alternativa en torno a este problema para que mi método todavía pueda devolver IEnumerable<T> ? Estoy usando .NET Core.

Respuesta popular

Creo que, a menos que sea un malentendido, solo quieres llamar

connection.Query(statement, parameters);

Sin los argumentos genéricos para hacer exactamente lo que estás pidiendo para darte una fila apta. Entonces puedes escribir

connection.Query(statement, parameters).Select(x => new { Something = x.Something}); 

Para crear un objeto anónimo

O para complicarse un poco más, puede convertirlo en un objeto expando al convertir la fila en IDictionary<string,object> y asignar iterativamente las propiedades a un objeto expando.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué