2009-03-12 18 views
5

Sto utilizzando NHibernate per interrogare il mio database con l'API dei criteri. I miei criteri è inferiore:Proiezioni NHibernate e clausola "Having"

ICriteria c = Session.CreateCriteria(typeof(Transaction)); 

ProjectionList projections = Projections.ProjectionList(); 
projections.Add(Projections.Sum("Units"), "Units"); 
projections.Add(Projections.GroupProperty("Account"), "Account"); 
projections.Add(Projections.GroupProperty("Security"), "Security"); 
c.SetProjection(projections); 

Questo sta lavorando bene, ma quello che vorrei è un modo per essere in grado di limitare la query solo tornare quando la proprietà "Unità" è> 0. In SQL vorrei semplicemente noi una clausola Having Units > 0 tuttavia non sono stato in grado di trovare un modo per farlo in NHibernate. Qualcuno ha qualche idea o è la mia unica opzione per usare HQL?

risposta

5

È possibile accedere a ProjectionCriteria dall'oggetto Criteria.

... 
c.SetProjection(projections) 
.ProjectionCriteria 
.Add(Restrictions.Ge("Units", 0)); 

EDIT: Questa soluzione attualmente non funziona, tuttavia dovrebbe funzionare in NHibernate 2.1.0

+2

sfortunatamente, questo non funziona come volevo. La restrizione viene applicata nella clausola WHERE anziché in una clausola having. Il risultato finale è che ogni singola riga è limitata piuttosto che la somma di tutte le righe. – lomaxx

+0

Strano, potrei giurare di averlo usato prima e ha funzionato. Sfortunatamente, la migliore documentazione che riesco a trovare è la presentazione della patch: http://nhjira.koah.net/browse/NH-1280. –

+1

grazie per le informazioni ... sembra che dovremo aspettare per 2.1.0 prima che questo sia supportato. Credo che sia incorporato in Hibernate ma NHibernate sta ancora aspettando – lomaxx

3

Per chi scende da qui con un problema simile, ho risolto in questo modo:

IProjection howMany = Projections.Count("Id").As("HowMany"); 

ICriteria criteria = session 
    .CreateCriteria<L10N>() 
    .SetProjection(
     howMany, 
     Projections.GroupProperty("Native"), 
     Projections.GroupProperty("Locale") 
    ); 

criteria.Add(Restrictions.Gt(howMany,1)); 
Problemi correlati