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"

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top