2011-09-06 55 views
3

我目前正在構建一個留言板,我需要在線程中輸出消息的數量。如何從NHibernate中的子查詢中獲取值?'

  • ID
  • 名稱
  • MessageCount

在普通的SQL它應該是這樣的,但我不能找到如何使inline select任何文件。

SELECT 
t.ID, 
t.Name 
(SELECT COUNT(*) FROM Messages m WHERE m.ThreadID = t.ID) 
FROM Threads t 

我只找到關於如何使用分離查詢來限制結果集的示例,而不是如何從中選擇實際值。

如何使用NHibernate進行內聯選擇?我更喜歡使用ICriteria而不是HQL。

編輯:我簡化了我的過於複雜的問題,使其更容易理解。

回答

4

您可以使用投影來做到這一點。在3.X使用QueryOver API它會是這個樣子(子查詢你的情況會有所不同,但不能太離譜):

var subquery = DetachedCriteria.For<ToppingUse> ("t") 
      .Add (Restrictions.EqProperty ("t.Pizza.Id", "p.Id")) 
      .SetProjection (Projections.Count ("Id")); 

    Pizza p = null; 

    var toppedPizzas = session.QueryOver<Pizza>(() => p) 
     .Select(Projections.Property(() => p.Id) 
      , Projections.Property(() => p.Sauce) 
      , Projections.Property(() => p.Crust) 
      , Projections.Alias(Projections.SubQuery(subquery), "ToppingCount")) 
     .List<object[]>(); //then you need to handle mapping on your own somehow (look into ResultTransformers if needed) 

這相當於下列標準:

var subquery = DetachedCriteria.For<ToppingUse> ("t") 
      .Add (Restrictions.EqProperty ("t.Pizza.Id", "p.Id")) 
      .SetProjection (Projections.Count ("Id")); 

    var toppedPizzas = session.CreateCriteria<Pizza>("p") 
     .SetProjection(Projections.Property("p.Id") 
      , Projections.Property("p.Sauce") 
      , Projections.Property("p.Crust") 
      , Projections.Alias(Projections.SubQuery(subquery), "ToppingCount")) 
     .List<object[]>();//then you need to handle mapping on your own somehow (look into ResultTransformers if needed) 

您只需確保在子查詢和外部查詢中使用相同的別名。

+0

A BIG謝謝你!它工作完美,我真的很高興你幫助我與這一個:) –

+0

很高興它的工作。我試着回來換一個更具代表性的子查詢。 – AlexCuse