2011-09-16 4 views
3

NHibernate에서 QueryOver를 사용하여 간단한 SQL (SQL Server 2005 사용)을 수행하려고합니다. 쿼리는 일련 번호가 항목 목록에서 반복적으로 사용 된 횟수를 계산 한 다음 1 회만 사용하여 일련 번호를 선택하는 것입니다. 1을 초과하는 일련 번호를 사용하고 싶지 않으므로 별개의 일련 번호는 필요하지 않습니다.QueryOver에서 SQL Count() 사용 방법

이 작업을 수행하는 SQL 쿼리는 다음과 같습니다

SELECT SERNUM, expr1 
FROM (SELECT SERNUM, COUNT(SERNUM) AS expr1 
     FROM ITEM 
     GROUP BY SERNUM) AS derivedtbl_1 
WHERE (expr1 = 1) 

지금까지 QueryOver는 사용하여 수행 한 내용 :이 코드는 SQL (가 카운트를 넣어 좋아하지 않는다 불구을 (생성

var query = session.QueryOver<Item>() 
         .Select(Projections.ProjectionList() 
         .Add(Projections.Count<Item>(x => x.Sernum)) 
         .Add(Projections.GroupProperty("Sernum"))).List(); 

) 열을 목록에 추가). 나는 그것이 수행하는 SQL 생성 1. ​​여기서 말하는만을 반환 할) 수 (에 의해 생성 된 데이터의 열을 액세스하는 방법을 잘 모르겠어요입니다 :

SELECT count(this_.SERNUM) as y0_, 
     this_.SERNUM  as y1_ 
FROM  ITEM this_ 
GROUP BY this_.SERNUM 

내가 난 잘 모르겠어요 이것은 올바른 방향으로 접근하고 있지만 누군가가 나를 가리킬 수 있기를 바랍니다.

+0

.Add (Projections.Count (X => x.Sernum)이 .as 같은 것을 수행 항목을 얻을 수

SELECT SERNUM FROM ITEM GROUP BY SERNUM HAVING COUNT(*) = 1 

같은 것을 생성한다 "count")) – Firo

답변

3
var serials = session.QueryOver<Item>() 
    .Where(Restrictions.Eq(Projections.Count<Item>(i => i.Id), 1)); 
    .Select(Projections.GroupProperty<Item>(i => i.Sernum)) 
    .List(); 

은 (

var subquery = QueryOver.Of<Item>() 
    .Where(Restrictions.Eq(Projections.Count<Item>(i => i.Id), 1)); 
    .Select(Projections.GroupProperty<Item>(i => i.Sernum)); 

var items = QueryOver.Of<Item>() 
    .WithSubquery.Where(i => i.Sernum).In(subquery); 
    .List(); 
+0

고마워, 정확히 내가 뭘 찾고 있었는지 몇 가지 비틀기. –