2011-01-28 6 views
6

이 SQL을 NHibernate에서 얻고 싶습니다.NHibernate에 산술 연산 예측이 있습니까?

SELECT SUM(color_pages) * SUM(total_pages) 
FROM connector_log_entry 
GROUP BY department_name 

그러나 어디에서나 연산 연산 (*)을 찾을 수 없습니다.

이것은 지금까지 가지고있는 코드입니다 :

Session.QueryOver<ConnectorLogEntry>() 
     .SelectList(list => list 
      .SelectGroup(m => m.DepartmentName) 
      .WithAlias(() => dto.Department) 
      .Select(Projections.Sum<ConnectorLogEntry>(m => m.TotalPages)) 
      //.Select(Projections.Sum<ConnectorLogEntry>(m => m.ColorPages)) 
      .WithAlias(() => dto.TotalColorPercentage)) 
     .TransformUsing(Transformers.AliasToBean<DepartmentConsumption>()); 
+1

ICriteria로 처리 할 수 ​​있다고해도 hql 쿼리는 훨씬 더 읽기 쉽습니다. – Sly

답변

8

산술 연산자는 VarArgsSQLFunction SQL 함수를 통해 조건 쿼리에 사용할 수 있습니다. 특정 경우에,이 같은 보일 것이다 :이 기술은 직접 생성 된 SQL에 문자열을 주입

Session.QueryOver<ConnectorLogEntry>() 
    .SelectList(list => 
     list.SelectGroup(m => m.DepartmentName) 
      .WithAlias(() => dto.Department) 
      .Select(Projections.SqlFunction(
       new VarArgsSQLFunction("(", "*", ")"), 
       NHibernateUtil.Int32, 
       Projections.Sum<ConnectorLogEntry>(m => m.TotalPages), 
       Projections.Sum<ConnectorLogEntry>(m => m.ColorPages))) 
      .WithAlias(() => dto.TotalColorPercentage)) 
    .TransformUsing(Transformers.AliasToBean<DepartmentConsumption>()); 

을, 그래서 당신은 기본 데이터베이스가 사용하는 연산자를 지원하는지 확인해야합니다.

+0

나는이 솔루션이 100 % 좋은지를 확인하는 빠른 방법을 가지고 있지 않지만 VarArgsSQLFunction 클래스 문서를 살펴봄으로써 내가 1 년 전에 찾고 있었던 것이라고 확신한다 :) 희망이 대답 앞으로 다른 사람들을 도울 것입니다. –

2

그것은 LINQ 또는 HQL와 사소한, 그러나 기준 및 QueryOver가 (당신이 SQL 프로젝션을 사용해야합니다)

그것을 위해 최적화되지 않은 :

내가 지금까지 가지고 그 코드

,921 :

select sum(ColorPages) * sum(TotalPages) 
from ConnectorLogEntry 
group by DepartmentName 

LINQ 하드 중 하나되지 않습니다 : HQL은 SQL과 거의 동일

+0

내 질문에이 쿼리는 작은 부분 일뿐입니다. 내 진짜 쿼리는 훨씬 더 어려워 내가 여기서 쓴, 그리고 내가 이미 QueryOver 모든있어 hql 또는 linq로 이동하는 것은 어렵고 문제가 될 것입니다. –

+0

너무 나쁨. 그런 다음 SQL 프로젝션을 사용하십시오. 행운을 빈다. –

+0

"Criteria와 QueryOver가 최적화되어 있지 않다"는 것은 무엇을 의미합니까? 이 문제를 해결할 사용자 지정 예측을 작성하는 데 문제가있을 것으로 예상됩니까? – csano