Frage

Ich habe einen Verkäufer. Jeder Anbieter hat mehrere Vorbehalte, mit einem Vorbehalt.

Ich möchte eine Liste von Anbietern, die haben nicht Heute noch eine Reservierung gemacht.

In SQL würde ich so etwas tun:

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'

Ich versuche es in Nhibernate so zu machen:

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

Dies funktioniert eindeutig nicht. Was mache ich falsch?

BEARBEITEN! Ich habe noch mehr herumgespielt und bin an diesen Punkt gekommen, was besser funktioniert:

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>();

Und um den Kommentar zu beantworten, erhalte ich den Fehler "nhiberNate.QueryException: konnte keine Eigenschaft lösen: MaxDate von: Lieferanten"

War es hilfreich?

Lösung

Wie Mauricio erwähnte, passt HQL besser zu diesem Problem.

Hier ist deine Frage:

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();

Wie Sie sehen, unterscheidet es sich nicht wesentlich von der SQL, außer dass NH bereits über die Beziehungen weiß, sodass Sie das Feld für den Join nicht angeben müssen.

Eine Sache zu berücksichtigen ist jedoch, dass diese Abfrage keine Liste von zurückgibt Vendor. Es gibt eine Liste von zurück object[], wobei jede Zeile zwei Elemente enthält: die ID und die maximale Projektion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top