2008-12-10 5 views
11

Tenemos una consulta que selecciona filas según el valor de otra, es decir. El máximo. No creo que realmente tenga mucho sentido, así que aquí está la consulta:Seleccionar objeto cuando una propiedad es igual a Máx. 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")); 

Mi pregunta es, ¿es esta la mejor manera? ¿Alguien puede sugerir una mejor manera?

+2

Creo que es la mejor manera de hacerlo. En SQL escribiría: SELECCIONE e * * de e WHERE e.Property = (SELECT MAX (e2.Property) WHERE e2.EnquiryCode = e.EnquiryCode) y eso es todo lo que está haciendo en su HQL. –

+0

Gracias, esto me ayudó con un problema similar (¡aunque no tienes respuestas!) – PandaWood

Respuesta

1

Para agregaciones, es mejor utilizar SQL y no HQL.Usar Nhibernate solo para las entidades principales y sus relaciones (diseño muy fácil de mantener). Los procedimientos almacenados son un lugar mejor para estas agregaciones y funciones porque dependen de los datos y no son objeto depende

0

Creo que esto debe trabajar:

(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

Explicación del código habría sido bueno aquí. –

Cuestiones relacionadas