2008-12-10 9 views
11

Abbiamo una query che seleziona le righe in base al valore di un'altra, ad es. il massimo Non penso che abbia molto senso, quindi ecco la domanda:Seleziona oggetto quando una proprietà è uguale a Max con NHibernate

var deatched = DetachedCriteria.For<Enquiry>("e2") 
    .SetProjection(Projections.Alias(Projections.Max("Property"), "maxProperty")) 
    .Add(Restrictions.EqProperty("e2.EnquiryCode", "e.EnquiryCode")); 

session.CreateCriteria(typeof(Enquiry), "e") 
    .Add(Subqueries.PropertyEq("Property", deatched)) 
    .AddOrder(Order.Asc("EnquiryCode")); 

La mia domanda è, è questo il modo migliore? Qualcuno può suggerire un modo migliore?

+2

Penso che sia il modo migliore per farlo. In SQL dovresti scrivere: SELECT e. * Da e WHERE e.Property = (SELEZIONA MAX (e2.Property) WHERE e2.EnquiryCode = e.EnquiryCode) e questo è tutto ciò che stai facendo nel tuo HQL. –

+0

Grazie, questo mi ha aiutato con un problema simile (anche se non hai risposte!) – PandaWood

risposta

1

Per le aggregazioni è preferibile utilizzare SQL e non HQL. Utilizzare Nhibere solo per le entità principali e le loro relazioni (progettazione molto mantenibile). Le procedure protette sono un posto migliore per queste aggregazioni e funzioni perché sono dipendenti dai dati e non oggetto dipendente

0

Penso che questo deve funzionare:

(from e in NHibernateSession().Query<Enquiry>() 
    where e.Property == (
    (
     from e2 NHibernateSession().Query<Enquiry>() 
     where e2.EnqueryCode == e.EnquiryCode 
     select e2.Property).Max() 
    ) 
    select e 
).ToList<Enquiry>() 
+1

Spiegazione del codice sarebbe stato bello qui. –

Problemi correlati