2014-09-02 86 views
4

具有SQL標準:NHibernate的:創建一個從子查詢

select COUNT(1) from 
(SELECT TOP 10 Status 
FROM SESSIONS 
where SERVER_ID = 2569 
ORDER by ID desc) as s 
where s.STATUS = 32768 

如何創建NHiberbate標準?語言C#。

 var subQuery = DetachedCriteria.For(typeof(Session)) 
      .SetProjection(Property.ForName("Status")) 
      .Add(Restrictions.Eq("Server", server)) 
      .AddOrder(Order.Desc("Id")) 
      .SetMaxResults(10); 
     var query = DetachedCriteria.For(typeof(Session)) 
      .Add(Subqueries.Exists(subQuery)) 
      .Add(Restrictions.Eq("Status.Id", valueFailStatus)) 
      .SetProjection(Projections.RowCount()); 
     using (var session = NHibernateHelper.OpenSession()) 
      return (int)query.GetExecutableCriteria(session) 
      .UniqueResult(); 

但我得到整個表的一個樣本,而不是這10個元素之一。

回答

2

眼下查詢說給我Session s的StatusIdvalueFailStatus只要這個子查詢返回任何結果

由於您使用的是Exists,因此您並未將查詢關聯在一起以完成自己想要的操作。

我想你正在尋找Subqueries.PropertyIn。事情是這樣的:

var subQuery = DetachedCriteria.For(typeof(Session)) 
    .SetProjection(Property.ForName("Id")) 
    .Add(Restrictions.Eq("Server", server)) 
    .AddOrder(Order.Desc("Id")) 
    .SetMaxResults(10); 

var query = DetachedCriteria.For(typeof(Session)) 
    .Add(Subqueries.PropertyIn("Id", subQuery)) 
    .Add(Restrictions.Eq("Status", 32768)) 
    .SetProjection(Projections.RowCount()); 

var result = (int)query.GetExecutableCriteria(s) 
    .UniqueResult(); 

...這將生成SQL,看起來像這樣:

SELECT 
    count(*) as y0_ 
FROM 
    Sessions this_ 
WHERE 
    this_.Id in (
     SELECT 
      TOP (10) this_0_.Id as y0_ 
     FROM 
      Sessions this_0_ 
     WHERE 
      this_0_.Server_Id = 2569 
     ORDER BY 
      this_0_.Id desc 
    ) 
    and this_.Status = 32768 
+0

@Radim:謝謝你的編輯。 – 2014-09-03 11:49:08