ВЫБЕРИТЕ МАКС. () С JOIN в NHibernate - PullRequest
1 голос
/ 04 июня 2010

У меня есть продавец. Каждый поставщик имеет несколько резервирований, с указанием даты резервирования.

Я хочу список поставщиков, которые не сделали заказ еще сегодня.

В SQL я бы сделал что-то вроде этого:

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'

Я пытаюсь сделать это в NHibernate так:

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

Это явно не работает. Что я делаю не так?

РЕДАКТИРОВАТЬ! Я поиграл еще немного, и дошел до этой точки, которая работает лучше:

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

И чтобы ответить на комментарий, я получаю сообщение об ошибке «NHibernate.QueryException: не удалось разрешить свойство: MaxDate of: Vendor»

1 Ответ

1 голос
/ 05 июня 2010

Как отметил Маурисио, HQL лучше подходит для этой проблемы.

Вот ваш запрос:

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

Как видите, он не сильно отличается от SQL, за исключением того, что NH уже знает об отношениях, поэтому вам не нужно указывать поле для Join.

Однако следует учитывать, что этот запрос не возвращает список Vendor. Возвращает список object[], где каждая строка содержит два элемента: Id и проекцию MAX.

...