2012-09-17 112 views
0

,我需要选择行的计数和条件:NHibernate的QueryOver - .SelectCount()与谓词

查询集齐计数:

var searchs = searchQuery.SelectList 
        (list => list 

           .SelectGroup(order => order.Id).WithAlias(() => groupResult.GlobalId) 
           .SelectCount(() => _transaction.ReturnStatus).WithAlias(() => groupResult.DeclineCount) 
        ) 

我需要等于201的交易数量。类似这样的:

.SelectCount(() => _transaction.ReturnStatus == 201).WithAlias(() => groupResult.DeclineCount) //runtime error 

在此先感谢!

PS: 原始SQL查询:

SELECT TOP 100 
     globalOrd.ID AS GlobalId , 
     SUM(CASE WHEN transact.returnStatus = 201 THEN 1 
       ELSE 0 
      END) AS DeclineCount 
FROM Orders.Global globalOrd 
     INNER JOIN Orders.TransactionDetail transactDet ON globalOrd.ID = transactDet.DetailID 
     INNER JOIN Orders.[Transaction] transact ON transactDet.TransactionID = transact.ID 
GROUP BY globalOrd.ID 

回答

0

如果您不需要在同一个查询的总数可以在限制选择列表的前只需添加:

var searchs = searchQuery.SelectList 
    (list => list 
       .Where(() => _transaction.ReturnStatus == 201) 
       .SelectGroup(order => order.Id).WithAlias(() => groupResult.GlobalId) 
       .SelectCount(() => _transaction.ReturnStatus).WithAlias(() => groupResult.DeclineCount) 
    ) 

如果但是,您希望总数和受限计数,您将不得不为后者使用类似以下的SqlProjection:

SUM(CASE {alias}.ReturnStatus WHEN 201 THEN 1 ELSE 0 END) 
+0

谢谢你的回答,我需要“两个”。我用原始SQL更新了这个问题。我仍然相信没有SqlProjection这样做 - 它似乎是如此简单的操作和查询不能做到这一点? –