2010-08-27 133 views
0

我使用的是夏普架構的MVC應用程序,我想生成以下SQL一個NHibernate的標準查詢:SQL NHibernate的條件查詢

select top 10 p.* from Tab1 p 
       join Tab2 v on p.Id = v.Tab1Fk 
       join Tab3 sbu on v.Id = sbu.Tab2Fk 
       where sbu.DateTime >= 12/12/2002 00:00:00 
       group by p.Id, p.Name, p.CoCode, p.CuCode, p.StCode, p.ParentFk, p.LastGenerated 
       order by COUNT(sbu.Id) desc 

目前我已經有了:

var crit = Session.CreateCriteria<Tab1>(); 
     crit.SetMaxResults(numberOfRecords); 
     crit.CreateCriteria("Tab2", "v", JoinType.InnerJoin) 
      .CreateCriteria("Tab3", "sbu", JoinType.InnerJoin) 
      .Add(Restrictions.Ge("sbu.DateTime", since)) 
      .AddOrder(Order.Desc(Projections.Count("sbu.Id"))); 
     return crit.List<Tab1>(); 

但它會引發錯誤,任何人都可以幫忙嗎?

+1

請指出您收到的例外情況。 – Jay 2010-08-27 16:41:07

回答

1

您是否考慮過使用HQLNHibernate.Linq?我有幾個項目,我幾乎總是從來不打擾標準api。

const string hql = @"select p.* 
        from Tab1 p 
        join p.Tab2 v where p.Tab2.Id = v.Id 
        join p.Tab3 sbu where v.Id = sbu.Tab2.Id 
        and sbu.DateTime >= :since 
        and rownum <= 10 
        group by p.Id, p.Name, p.CoCode 
        order by count(sbu.Id) desc"; 

var list = Session.CreateQuery(hql) 
       .SetParameter("since", DateTime.Now /* your date */) 
       .List<Tab1>(); 

看起來你對SQL很好,所以他們看起來都很自然。

編輯:我必須說我從來沒有通過count(item)命令,所以我的語法可能會關閉。 :)