1

ベンダーがいます。すべてのベンダーには、ReservationDate が設定された複数の予約があります。

今日まだ予約していないベンダーのリストが欲しい。

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」というエラーが表示されます。

4

1 に答える 1

1

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 は既にリレーションシップを認識しているため、Join のフィールドを指定する必要がないことを除けば、SQL と大差ありません。

ただし、考慮すべきことの 1 つは、このクエリが List of を返さないことですVendor。のリストを返しますobject[]。各行には、Id と MAX 射影の 2 つの要素が含まれています。

于 2010-06-05T00:40:14.277 に答える