Je suis en train d'apprendre Dapper et j'ai du mal à créer des instances de types anonymes avec elle. Tout d'abord, un contexte: nous avons une méthode qui retourne un IEnumerable<T>
. Notez que T
peut être anonyme.
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 qu'il gère également les types anonymes, et le problème que pose le compilateur est le suivant:
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 le problème est le fait que les objets anonymes n'ont aucun constructeur avec lequel travailler. Une alternative à cela serait (T)Activator.CreateInstance(typeof(T), row)
, mais la variable de row
doit être un object[]
, pas un DapperRow
.
Chaque fois que je cherchais des informations sur ce sujet, tout le monde disait que je ne devrais pas travailler avec des types anonymes pour commencer. Cependant, il est nécessaire 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 je comprends mal les choses 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 puisse toujours renvoyer IEnumerable<T>
? J'utilise .NET Core.
Je pense que, à moins que je ne comprenne pas, vous voulez juste appeler
connection.Query(statement, parameters);
Sans les arguments génériques pour faire exactement ce que vous demandez pour vous donner une ligne épurée. Alors vous pouvez écrire
connection.Query(statement, parameters).Select(x => new { Something = x.Something});
Pour créer un objet anonyme
Ou, pour être un peu plus compliqué, vous pouvez convertir en objet expando en convertissant la ligne en IDictionary<string,object>
et en attribuant itérativement les propriétés à un objet expando.