2011-08-03 10 views
6

QueryOver <> 구문을 사용하여 다음 SQL 문을 작성하려면 어떻게해야합니까? NHibernate QueryOver <> - SubQuery에 대한 집계 함수

SELECT COUNT(*) FROM (
    SELECT FirstName,LastName 
    FROM People 
    GROUP BY FirstName, LastName 
    ) as sub_t 

나는 내부 쿼리가 지금까지 작업이 있습니다

var q = _session.QueryOver<Person>() 
    .SelectList(l => l 
     .SelectGroup(x => x.FirstName) 
     .SelectGroup(x => x.LastName)); 

하지만 하위 쿼리에서이 싸서 행 그것을 밖으로 계산하는 방법을 모른다. 할 수 있습니까?

불행히도 내 RDBMS 사투리 (MsSqlCe40Dialect)는 COUNT DISTINCT를 지원하지 않으므로 SelectCountDistinct()를 사용하는 이점이 없습니다.

답변

0

IQueryOver의 RowCount 속성을 사용할 수 있습니까? 이처럼 :

var totalRows = _session.QueryOver<Person>() 
.SelectList(l => l 
    .SelectGroup(x => x.FirstName) 
    .SelectGroup(x => x.LastName)).RowCount(); 
+1

불행히도 귀하의 제안에 GROUP BY가 보존되지 않았기 때문에 SqlCe4와 SQL Server 2008에서 테스트했습니다. 두 경우 모두 생성 된 쿼리는 "SELECT count (*) as y0_ FROM [People] this_"입니다. – twerq

1

좋아, 내가 QueryOver를 사용 behing 이유를 모르겠지만, 나는 같은 것을 할 것입니다, 당신이 찾고있는 당신을 줄 것이다 생각 :

Session.CreateCriteria<Person>() 
       .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.GroupProperty("FirstName"))) 
        .Add(Projections.GroupProperty("LastName"))) 
       .List<Person>().Count(); 

희망이 도움이 ...

+0

유감스럽게도 원하는 SQL을 생성하지 못합니다. (엄청날 수있는) 전체 레코드 목록은 계산되기 전에 .NET 코드로로드됩니다. – twerq

1

나는 QueryOver에 익숙하지 않지만 다음과 같은 집계 함수를 사용했습니다.이 유형의 계산에 대해 하위 쿼리를 사용할 수 없거나 유용한 것으로 생각되면 게시자가 몇 가지 발견했습니다. 이전에 알지 못했던 문제들도 게시했습니다.

참고 : 보통 데이터 양은 10 배 정도 느립니다.

집계 방법은 특별한 경우

유사한 조합 이름 "조 스미스" "Joes의 MITH" (가정 ~ 데이터 세트에없는) 대

에 대한

SELECT 
COUNT(DISTINCT FirstName+LastName) 
FROM People 

수용

SELECT COUNT(DISTINCT FirstName+'~'+LastName) FROM People 

nulls (으로 sumes ^,

SELECT 
COUNT(DISTINCT IsNull(FirstName,'^')+'~'+IsNull(LastName,'^')) 
FROM People 

공백을 후행) 데이터 집합에없는 RTRIM은

SELECT 
COUNT(DISTINCT IsNull(RTrim(FirstName),'^')+'~'+IsNull(Rtrim(LastName),'^')) 
FROM People 

하여 벤치마킹 AMD의 데이터 (80K 행 단일 쿼드 코어)

그룹에 고유 보인다

80-100ms - 실행 하위 쿼리 방법 (OP 참조)

800-1200ms - distinc를 사용한 집계 방법 특별한 경우를 수용하는 것은별로 눈에 띄지 않는 것 같습니다.

관련 문제