选择MAX(),并在NHibernate中加入JOIN

选择MAX(),并在NHibernate中加入JOIN,join,nhibernate,group-by,max,having,Join,Nhibernate,Group By,Max,Having,我有一个小贩。每个供应商都有几个预订,上面有一个预订日期 我想要一份今天还没有预订的供应商名单 在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' session.

我有一个小贩。每个供应商都有几个预订,上面有一个预订日期

我想要一份今天还没有预订的供应商名单

在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'
session.CreateCriteria<Vendor>()
                    .CreateAlias("Reservations", "r")
                    .SetProjection(Projections.Alias(Projections.Max("r.ReservationDate"), "MaxDate"))
                    .Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)))
                    .List<Vendor>();
从供应商v选择v.Id,MAX(r.ReservationDate)作为MaxDate
v.Id=r.Vendor\U Id上的内部联接DailReservation r
按v.Id分组
最大(r.预订日期)'2010-06-04'
我试着在NHibernate这样做:

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'
session.CreateCriteria<Vendor>()
                    .CreateAlias("Reservations", "r")
                    .SetProjection(Projections.Alias(Projections.Max("r.ReservationDate"), "MaxDate"))
                    .Add(Restrictions.Not(Restrictions.Eq("MaxDate", DateTime.Today)))
                    .List<Vendor>();
session.CreateCriteria()
.CreateAlias(“保留”、“r”)
.SetProjection(Projections.Alias(Projections.Max(“r.ReservationDate”),“MaxDate”))
.Add(Restrictions.Not(Restrictions.Eq(“MaxDate”,DateTime.Today)))
.List();
这显然不起作用。我做错了什么

编辑我又玩了一些,并且达到了这一点,这一点效果更好:

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>();
var c=Session.CreateCriteria();
c、 CreateAlias(“保留”、“r”);
ProjectionList projections=projections.ProjectionList();
添加(projections.Max(“r.ReservationDate”),“MaxDate”);
projections.Add(projections.GroupProperty(“Id”));
c、 设置投影(投影);
c、 添加(Restrictions.Not(Restrictions.Eq(“MaxDate”,DateTime.Today));
返回c.List();

为了回答这个评论,我得到了错误“NHibernate.QueryException:无法解析属性:MaxDate of:Vendor”

正如Mauricio提到的,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();
session.CreateQuery(
@"
选择v.Id,最大值(r.ReservationDate)
来自供应商v
加入
按v.Id分组
具有MAX(r.ReservationDate):MaxDate
")
.SetParameter(“MaxDate”,DateTime.Today)
.List();
正如您所看到的,它与SQL没有太大的不同,只是NH已经知道了关系,所以您不必为联接指定字段


需要考虑的一件事是,此查询不返回“代码>供应商< /代码>的列表。它返回一个

对象[]
列表,其中每一行包含两个元素:Id和MAX projection。

正如Mauricio提到的,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();
session.CreateQuery(
@"
选择v.Id,最大值(r.ReservationDate)
来自供应商v
加入
按v.Id分组
具有MAX(r.ReservationDate):MaxDate
")
.SetParameter(“MaxDate”,DateTime.Today)
.List();
正如您所看到的,它与SQL没有太大的不同,只是NH已经知道了关系,所以您不必为联接指定字段


需要考虑的一件事是,此查询不返回“代码>供应商< /代码>的列表。它返回一个

object[]
列表,其中每一行包含两个元素:Id和最大投影。

您得到的错误是什么?您使用条件而不是HQL的任何特定原因?@Jon,我已经编辑了这个问题@毛里西奥,不是真的。我没有用过HQL,所以我用的是我所知道的(稍微好一点)。你有什么错误?你使用标准而不是HQL有什么特别的原因吗?@Jon,我已经编辑了这个问题@毛里西奥,不是真的。我没有使用HQL,所以我使用了我所知道的(稍微好一点)。