2009-11-24 62 views
1

我有一個父子表關係:元素 - (1到n) - > ContentBlocks。每個ContentBlock行都有:唯一標識(Id),元素標識,版本以及一些不太相關的字段。我試圖獲取所有具有最高版本號(和Id)的內容行。NHibernate:如何在CreateCriteria中使用「IN」?

我這行SQL的,讓我什麼,我想:

SELECT * FROM ContentBlocks WHERE Id IN 
    (SELECT MAX(Id) FROM ContentBlocks GROUP BY ElementId) 

(假定最新版本具有最高的編號)

然而,我無法弄清楚如何從NHibernate獲取它。這是我得到的最接近的:

var subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(Projections.Max("Id")) 
      .SetProjection(Projections.GroupProperty("ElementId")); 

var query = session.CreateCriteria<ContentBlock>() 
      .Add(Subqueries.PropertyIn("Id", subquery)).List<ContentBlock>(); 

如果我執行子查詢,我得到表中唯一的ElementIds列表。相反,我需要最新的ContentBlocks的ID列表。如果我顛倒了子查詢上SetProjections的順序,我只得到了ElementId的最大值。

我也試過這樣:

 subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.Max("Id")) 
        .Add(Projections.GroupProperty("ElementId")) 
       ); 

但讓我陣列的列表,在這2個元素,標識& ElementId,其中個createCriteria呼叫無法處理。

有沒有辦法在結果中不包含分組屬性「ElementId」?或者指定我想要返回Max(Id)?

回答

相關問題