2017-05-19 2 views
1

Je suis en train d'apprendre Dapper et j'ai des difficultés à créer des instances de types anonymes avec celui-ci. Tout d'abord, un certain contexte: nous avons une méthode qui retourne un IEnumerable<T>. Notez que T peut être anonyme.Création d'instances d'objets anonymes à l'aide de Dapper

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

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

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

Ce code fonctionne pour les classes enregistrées comme un charme. Cependant, je veux gérer des types anonymes aussi bien, et le problème est de lancer par le compilateur est:

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" 

Je sais que la question est le fait que les objets anonymes ont pas les constructeurs à travailler. Une alternative à cela serait (T)Activator.CreateInstance(typeof(T), row), mais la variable row doit être un object[], pas un DapperRow.

Chaque fois que j'ai cherché des informations sur ce sujet, tout le monde a dit que je ne devrais pas travailler avec des types anonymes pour commencer. Cependant, il est requis que ma fonction renvoie une collection d'éléments de type anonyme.

C'est la première fois que j'utilise Dapper, et je ne sais pas si j'ai mal compris ou non. La question est: comment puis-je créer une instance d'un objet anonyme avec Dapper, ou quelle est l'alternative autour de ce problème afin que ma méthode peut toujours retourner IEnumerable<T>? J'utilise .NET Core.

Répondre

2

Je pense, à moins que je vous veux juste malentendu appeler

connection.Query(statement, parameters); 

Sans les arguments génériques de faire exactement ce que vous demandez de vous donner une ligne pimpant. Ensuite, vous pouvez écrire

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

Pour créer un objet anonyme. Pour vous rendre un peu plus compliqué, vous pouvez convertir en objet expando en convertissant la ligne en IDictionary<string,object>, et en affectant itérativement les propriétés à un objet expando.

+0

C'est ce que j'ai trouvé jusqu'à maintenant. Le problème est que je ne peux pas coder en dur les propriétés de cet objet '' 'new''', et je ne suis pas sûr de savoir comment parcourir par programmation les propriétés de' '' '' DapperRow''' et de mon type afin de reconstruire la structure pour le nouvel objet dans un '' '' ExpandoObject'''. – dmngrsk

+0

Je pense que vous pouvez lancer chaque ligne à (IDictionary ) – gmn