2014-09-02 82 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