Вопрос

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

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

В 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: поставщик"

Это было полезно?

Решение

Как упоминал Маурисио, 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 уже знает об отношениях, поэтому вам не нужно указывать поле для соединения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top