NHibernate:从子查询创建条件
本文关键字:创建 条件 查询 NHibernate | 更新日期: 2023-09-27 18:20:15
拥有SQL:
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个元素中的一个。
现在您的查询显示只要此子查询返回任何结果,就用valueFailStatus
的StatusId
获取我的Session
s。
由于您使用的是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