2010-06-04 60 views
1

我有一個供應商。每個供應商都有幾個預訂,其中有一個預訂日期。選擇MAX()加入NHibernate

我想要一個供應商列表而不是今天進行了預訂。

在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的:供應商「

+0

你得到的錯誤是什麼? – 2010-06-04 19:01:23

+0

您使用Criteria而不是HQL的任何特定原因? – 2010-06-04 19:11:28

+0

@Jon,我編輯了這個問題。 @Mauricio,不是真的。我沒有使用HQL,所以我只是用我所知道的(略好一點)。 – 2010-06-04 19:17:32

回答

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(); 

正如你看到的,它不是從SQL太大的不同,除了爲NH已經知道了那個關係的事實,所以你不必指定字段加入。

但要考慮的一件事是,該查詢不返回列表Vendor。它返回一個列表object[],其中每行包含兩個元素:Id和MAX投影。

+0

謝謝迭戈! HQL取得了訣竅。 – 2010-06-07 15:03:55