SELEZIONE MAX () con JOIN in NHibernate
-
24-10-2019 - |
Domanda
Ho un fornitore. Ogni venditore ha parecchie prenotazioni, con una ReservationDate su di esso.
Voglio un elenco di fornitori che hanno non fatto una prenotazione ancora oggi.
In SQL vorrei fare qualcosa di simile:
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'
sto cercando farlo in NHibernate in questo modo:
session.CreateCriteria<Vendor>()
.CreateAlias("Reservations", "r")
.SetProjection(Projections.Alias(Projections.Max("r.ReservationDate"), "MaxDate"))
.Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)))
.List<Vendor>();
Questo chiaramente non funziona. Che cosa sto facendo di sbagliato?
Modifica Ho suonato in giro un po 'di più, e arrivati ??a questo punto, che sta lavorando meglio:
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>();
E per rispondere al commento, sto ottenendo l'errore "NHibernate.QueryException: non poteva resolve: MaxDate di: Venditore"
Soluzione
Come accennato Mauricio, HQL è una misura migliore per questo problema.
Ecco la tua query:
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();
Come si vede, non è molto diverso dal SQL, tranne per il fatto che NH sa già sui rapporti, in modo da non è necessario specificare il campo per il join.
Una cosa da considerare, però, è che questa query non restituisce un elenco di Vendor
. Restituisce un elenco di object[]
, in cui ogni riga contiene due elementi:. L'ID e la proiezione MAX