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'
私はこのように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: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();
ご覧のとおり、NHが関係についてすでに知っているという事実を除いて、SQLとそれほど違いはありません。結合のフィールドを指定する必要はありません。
ただし、考慮すべきことの1つは、このクエリがのリストを返さないことです。 Vendor
. 。のリストを返します object[]
, 、各行には2つの要素が含まれています:IDとMAX投影。
所属していません StackOverflow