Wie kann man ganz einfach eine generische Liste in ein generisches DTO wandeln? Diese Frage stellten wir uns letztens in der Arbeit. Nach mehreren Codezeilen um die generische Liste (manuell) zu mappen, waren wir der Meinung, dass es doch einfacher zu handhaben sein muss.
Nach einer längeren Recherche sind wir dann auf Transformers.AliasToBean gestoßen. Anbei ein kleines Beispiel für die Anwendung von Transformers.AliasToBean.
So könnte die Klasse Auflage aussehen:
Image may be NSFW.
Clik here to view.
Das dazugehörige DTO:
Image may be NSFW.
Clik here to view.
Da ich Fluent-NHibernate verwende, wird die Klasse wie folgt gemappt:
1: public class AuflagenMap : ClassMap<Auflage>
2: {
3: public AuflagenMap(){
4: Id(x => x.Id);
5: Map(x => x.Datum);
6: Map(x => x.Anzahl);
7: }
8: }
Mit Projections.Sum(Anzahl).As(Auflage) wird bestimmt wohin gemappt werden soll. Anzahl kommt aus Auflage und wird per Alias (.As) in das Property Auflage gemappt. Das gleiche gilt natürlich auch für die Gruppierung nach Datum.
1: public IEnumerable<AuflageDto> AuflagenSummierung(){
2: var criteria = m_Session.CreateCriteria(typeof (Auflage))
3: .SetProjection(Projections.ProjectionList()
4: .Add(Projections.Sum("Anzahl").As("Auflage"))
5: .Add(Projections.GroupProperty("Datum").As("Datum")))
6: .AddOrder(Order.Asc("Datum"))
7: .SetResultTransformer(Transformers.AliasToBean(typeof (AuflageDto)))
8: .List<AuflageDto>();
9: return criteria;
10: }
Das Ergebnis sieht dann so aus:
Image may be NSFW.
Clik here to view.