2010-02-05 5 views
6

angenommen, in einer Entität gibt es Attribute ID, Benutzername, Alter, Adresse. Jetzt möchte ich nur ID und Benutzernamen und ich benutze diesen Code dafür.Projektionen in NHibernate

Projektionen ermöglichen die Rückgabe von etwas anderem als einer Liste von Entitäten aus einer Abfrage.

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .List(); 

Wie werde ich die Werte abrufen. In welchem ​​Objekt wird dieser Wert genommen?

Antwort

27

Wenn kein Ergebnistransformator verwendet wird, führt eine Projektion zu einer Liste anonymer Objekte mit den projizierten Werten. Dies wäre für die Datenbindung ausreichend.

Für andere Verwendungszwecke möchten Sie einen Ergebnistransformer festlegen, der Objekte eines bekannten Typs erstellt. Die AliasToBeanTransformer erstellt für jede Zeile ein Objekt des angegebenen Typs und legt seine Eigenschaften auf die Zeilenwerte fest. Wenn Sie den Typ der Ergebnisse kennen, können Sie die allgemeine Methode List<T>() verwenden.

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

Ergebnistransformatoren können auch für SQL- und HQL-Abfragen verwendet werden.

list2 = Session.CreateSQLQuery("select Id, Username from user_table") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

list2 = Session.CreateQuery("select Id, Username from User") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

In diesen Beispielen muss die Result-Klasse keine zugeordnete Klasse sein und muss die ausgewählten Eigenschaften aufweisen.

partial class Result 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
} 
+0

obwohl ich nicht das Framework 3.0 (var Schlüsselwort) verwendet habe, war ich endlich in der Lage herauszufinden, wie man einzelne Spalten mit dieser Antwort auswählen! nahm mich den ganzen Tag, um es zu finden –

Verwandte Themen