Pregunta

Tengo un vendedor. Cada proveedor tiene varias reservas, con una fecha de reserva.

Quiero una lista de proveedores que tengan no Hice una reserva todavía hoy.

En SQL haría algo como esto:

SELECT v.Id, MAX(r.ReservationDate) AS MaxDate FROM Vendor v 
INNER JOIN DailyReservation r ON v.Id = r.Vendor_Id
GROUP BY v.Id
HAVING MAX(r.ReservationDate) <> '2010-06-04'

Estoy tratando de hacerlo en nhoBernate como este:

session.CreateCriteria<Vendor>()
                    .CreateAlias("Reservations", "r")
                    .SetProjection(Projections.Alias(Projections.Max("r.ReservationDate"), "MaxDate"))
                    .Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)))
                    .List<Vendor>();

Esto claramente no funciona. ¿Qué estoy haciendo mal?

¡EDITAR! Jugué un poco más y llegué a este punto, que funciona mejor:

var c = Session.CreateCriteria<Vendor>();
c.CreateAlias("Reservations", "r");

ProjectionList projections = Projections.ProjectionList();
projections.Add(Projections.Max("r.ReservationDate"), "MaxDate");
projections.Add(Projections.GroupProperty("Id"));
c.SetProjection(projections);
c.Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)));

return c.List<Vendor>();

Y para responder al comentario, recibo el error "nHibernate.QueryException: no pudo resolver la propiedad: MaxDate of: Vendor"

¿Fue útil?

Solución

Como Mauricio mencionó, HQL es mejor para este problema.

Aquí está tu consulta:

session.CreateQuery(
  @"
  SELECT v.Id, MAX(r.ReservationDate)
  FROM Vendor v
  JOIN v.Reservations r
  GROUP BY v.Id
  HAVING MAX(r.ReservationDate) <> :MaxDate
  ")
  .SetParameter("MaxDate", DateTime.Today)
  .List();

Como puede ver, no es muy diferente del SQL, excepto por el hecho de que NH ya conoce las relaciones, por lo que no tiene que especificar el campo para la unión.

Sin embargo, una cosa a considerar es que esta consulta no devuelve una lista de Vendor. Devuelve una lista de object[], donde cada fila contiene dos elementos: la identificación y la proyección máxima.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top