在NHIBERNATE中选择Max()
-
24-10-2019 - |
题
我有一个供应商。每个供应商都有多个保留,并有一个预订。
我想要一个供应商清单 不是 今天预订了。
在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>();
这显然不起作用。我究竟做错了什么?
编辑! 我玩了更多的比赛,到了这一点,这效果更好:
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:供应商”
解决方案
正如毛里西奥(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();
如您所见,它与SQL并没有太大不同,除了NH已经知道这种关系的事实,因此您不必为加入指定字段。
但是,要考虑的一件事是,此查询不会返回 Vendor
. 。它返回 object[]
, ,每行包含两个元素:ID和最大投影。
不隶属于 StackOverflow