2010-02-05 11 views
6

supponiamo che in un'entità ci siano attributi id, nome utente, età, indirizzo. Ora voglio solo id e username e uso questo codice per questo.Proiezioni in NHibernate

Le proiezioni consentono di restituire qualcosa di diverso da un elenco di entità da una query.

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(); 

Come recuperare i valori. In quale oggetto verranno presi questi valori.

risposta

27

A meno che non venga utilizzato un trasformatore di risultati, una proiezione genererà un elenco di oggetti anonimi con i valori proiettati. Questo sarebbe sufficiente per l'associazione dei dati.

Per altri usi, si desidera impostare un trasformatore di risultati che crei oggetti di un tipo noto. Lo AliasToBeanTransformer creerà un oggetto del tipo specificato per ogni riga e imposterà le sue proprietà sui valori di riga.

Se si conosce il tipo di risultati, è possibile utilizzare il metodo generico List<T>().

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>(); 

I trasformatori di risultato possono essere utilizzati anche su query SQL e HQL.

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 questi esempi la classe Risultato non deve essere una classe mappata e deve avere le proprietà selezionate.

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

sebbene non abbia utilizzato il framework 3.0 (parola chiave var), sono finalmente riuscito a capire come selezionare le colonne individuali utilizzando questa risposta! mi ha preso tutto il giorno per trovarlo –