2017-06-13 2 views
1

Quelle est la meilleure façon de faire ce qui suit ...constructeur imbrications de Dapper

conn.Query<Foo>(@"SELECT 1, 2, 'ZEBRA'"); 

Say Foo a un constructeur comme si ...

public Foo(Bar test, string zebra) 

..Et Bar a un constructeur comme ceci:

public Bar(int one, int two) 

Cela ne fonctionne pas, quelle serait la meilleure approche pour atteindre e le résultat souhaité.

+0

'Foo (int premier, int seconde, chaîne DERP): ce (nouveau bar (premier, deuxième), DERP) {}' – Will

Répondre

2

Vous pouvez essayer l'API de requête non générique (plus de détails sont ici https://stackoverflow.com/a/8995135/229949):

conn.Query(@"SELECT 1 as one, 2 as two, 'ZEBRA' as zebra") 
    .Select(_ => new Foo(new Bar(_.one, _.two), _.zebra); 
1

Ne pas essayer d'hydrater dans vos modèles réels directement à partir Dapper si elles ont des exigences du constructeur comme ça. Au lieu de cela, hydratez-vous dans une classe privée/interne, puis instanciez et renvoyez les modèles appropriés.

internal class FooBarQueryModel 
{ 
    public string Zebra { get; set; } 
    public int One { get; set; } 
    public int Two { get; set; } 
} 

conn.Query<FooBarQueryModel>(sql).Select(qm => new Foo(new Bar(qm.One, qm.Two), qm.Zebra)); 
+0

cela aurait un certain avantage par rapport à la solution de la ligne 'dynamique', peut-être la performance ? –