2009-07-13 8 views
2

Ich muss eine Auflistungseigenschaft in einem DTO bevölkert bekommen, und ich habe Probleme, Informationen dazu zu finden.Wie bekomme ich eine Sammlung für ein DTO-Mitglied mit Nhibernate?

Ich habe versucht, es so zu tun:

ICriteria selectCriteria = Session.CreateCriteria<DataRun>() 
      .SetProjection(Projections.ProjectionList() 
       .Add(Projections.Property("SomeCollection"), "Collection")) 
      .SetResultTransformer(Transformers.AliasToBean<MyDto>()); 

aber MyDto.Collection ist immer null. Mache ich das falsch, ist das überhaupt möglich?

Auch hatte ich ursprünglich geplant, dies mit einer SubQuery zu tun, so konnte ich nur meine DTO-Sammlung mit anderen DTOs füllen, aber dies wird nicht funktionieren, weil das Ergebnis der Unterabfrage mehr als 1 Zeile (wie es sollte) und Sqlit mag das nicht (löst eine Ausnahme aus). Was ist das Richtige hier?

+0

Ich glaube, Sie versuchen, eine Eins-zu-viele-zu tun, die in Ihrem Mapping getan werden sollte, aber ich bin nicht wirklich sicher. Können Sie Ihre Mapping-Dateien posten? –

+0

Ich mache eine Eins-zu-viele und meine abgebildeten Entitäten funktionieren gut für diese Art von Sache, aber ich möchte nicht meine zugeordnete Entity zurück, ich möchte ein DTO mit einer Reihe von Eigenschaften und was nicht speziell für die Ansicht, in der sie verwendet werden. – mockobject

Antwort

0

Ich habe abgerufen Sammlung Eigenschaften in meinem Projekt mit folgenden Syntax:

public IList<ChildCollectionType> GetChildObjectsByParentId(Int32 id) 
{ 
    ISession session = GetSession();//Get NHibernate session routine 
    return session.Load<ParentDTO>(id).ChildCollectionProperty; 
} 

wo id ist der Schlüssel des übergeordneten Objekts.

+0

Entschuldigung, ich habe deine ursprüngliche Frage nicht richtig gelesen. Ich habe nicht bemerkt, dass Sie versucht haben, ein benutzerdefiniertes DTO mit einer Collection-Eigenschaft zu füllen. Es gibt ein paar andere Beiträge hier mit Leuten, die Probleme mit aliasToBean haben, zum Beispiel http://Stackoverflow.com/questions/4504054/simple-hibernate-aliastobean-not-working –

0

Sie können benutzerdefinierte Transformation verwenden.

ICriteria selectCriteria = Session.CreateCriteria<DataRun>() 
      .SetProjection(Projections.ProjectionList() 
       .Add(Projections.Property("SomeCollection"), "Collection")) 
      .TransformUsing(new CustomTransformer()); 

Hier ist Ihre individuelle Transformator Implementierung

public class CustomTransformer : IResultTransformer 
    { 
     public System.Collections.IList TransformList(System.Collections.IList collection) 
     { 
      return collection; 
     } 

     public object TransformTuple(object[] tuple, string[] aliases) 
     { 
      return new MyDto 
      { 
       //map your data to dto and convert to data type if needed 
       YourProperty1 = tuple[0], 
       YourProperty12 = (int)tuple[1] 
      }; 
     } 
    }