2010-05-18 31 views
1

我試圖重新像使用NHibernate標準的SQL語句:如何使用具有內部選擇案例的NHibernate重新創建SQL語句?

select Range, count(*) from (
    select 
     case 
     when ent.ID between 'A' and 'N' then 'A-M' 
     else 'Other' 
     end as Range 
    from Subject 
) tbl 
group by tbl.Range 

我能夠創造內部的選擇如下:

session.CreateCriteria<Subject>() 
    .SetProjection(
     Projections.Conditional(
     Expression.Between("Name", "A", "N"), 
     Projections.Constant("A-M"), 
     Projections.Constant("Other"))) 
    .List(); 

然而,我無法弄清楚如何將這些結果按行計數分組。

+0

你的意思是'介於'A'和'M'之間,然後'A-M''?......因爲我認爲'介於'之間是包容性的。 – dotjoe 2010-05-18 20:11:42

回答

2

這應該工作...

session.CreateCriteria<Subject>() 
    .SetProjection(
     Projections.ProjectionList() 
      .Add(
      Projections.GroupProperty(
       Projections.Conditional(
        Restrictions.Between("Name", "A", "N"), 
        Projections.Constant("A-M"), 
        Projections.Constant("Other")))) 
     .Add(Projections.RowCount())) 
    .List(); 

...但事實並非如此。所以你可以這樣做:

session.CreateCriteria<Subject>() 
    .SetProjection(
     Projections.ProjectionList() 
     .Add(
      Projections.GroupProperty(
       Projections.SqlProjection(
        @"case 
         when Name between 'A' and 'N' then 'A-M' 
         else 'Other' 
        end as Range", 
        new[] { "Range" }, 
        new[] { TypeFactory.GetStringType(5) }))) 
     .Add(Projections.RowCount())) 
    .List(); 
+0

謝謝,這確實有效,但我希望不要拖放到SQL中。任何想法爲什麼你的第一個例子不起作用? – brianberns 2010-05-18 20:23:43

+0

我不確定。這可能是NHibernate中的一個錯誤。但隨時可以嘗試一下,也許我錯過了一些東西。 – 2010-05-19 00:30:21