2009-07-02 13 views
14

Come è possibile ottenere una singola colonna indietro da una query anziché da un intero oggetto?Ottenere una singola colonna da un'entità

avrei potuto fare qualcosa di simile per ottenere l'intero oggetto, ma tutto quello che voglio è i nomi:

IList<Tribble> tribbles = session.CreateCriteria(typeof(Tribble)).List<Tribble>(); 
IList<string> names = new List<string>(); 
foreach (Tribble t in tribbles) { 
    names.Add(t.Name); 
} 

Mi piacerebbe essere in grado di specificare criteri aggiuntivi, così è possibile escludere solo determinate colonne da recuperare?

risposta

23

Ecco la soluzione alla fine ho finito per usare:

ICriteria c = session.CreateCriteria(typeof(Tribble)); 
c.SetProjection(Projections.ProjectionList().Add(Projections.Property("Name"))); 
IList<string> names = c.List<string>(); 

Ho avuto questa idea da this old StackOverflow question.

-2

Generalmente no. Raramente ha senso avere un oggetto business parzialmente popolato.

Perché vuoi farlo?

+0

Io lo utilizzo per tutto il programma con decine di classi, questa è l'unica volta che ho necessario per fare questo ed è necessario in questa circostanza. –

+0

Puoi spiegare ulteriormente che cos'è il caso d'uso? –

+0

Non succede tutto questo tempo? Ad esempio, desidero visualizzare i dettagli di un dipendente più il nome del suo ufficio. Non ho bisogno di tutto l'ufficio, solo il nome. – cbp

2

Che dire di eseguire una query per stringa?

IList<string> names = session.CreateQuery("select name from Tribbles").List<string>(); 
+1

Tecnicamente, in realtà dovresti fare questo: IList names = session.CreateQuery ("seleziona t.name da Tribbles t"). List (); –

2

si può fare qualcosa di simile:

IQuery query = dao.GetQuery(@"SELECT u.Id 
           FROM UserImpl u 
           WHERE u.UserName = :username"); 
       query.SetParameter("username", username); 
return (long)query.UniqueResult(); 
7

Quasi cinque anni dopo ..., questo è quello che si potrebbe fare usando NHibernate.Linq:

IList<string> names = session.Query<Tribble>().Select(t => t.Name).ToList() 
Problemi correlati