2012-09-17 2 views
0

와 나는 조건 행의 수를 선택해야합니다NHibernate에 QueryOver - .SelectCount() 술어

쿼리가 풀 카운트를 수집 :

var searchs = searchQuery.SelectList 
        (list => list 

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

I (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

당신은 단순히 selectList의 이전 제한에 추가 할 수 있습니다 같은 쿼리의 총 개수 필요가없는 경우 :

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없이 그것을 할 것이라고 믿는다. - 그것은 매우 간단한 조작과 질의 오버런 인 것처럼 보인다. –