2013-05-20 2 views
2

를 사용하여 하위 쿼리의 속성으로 그룹 않고 단지 최대 절을 선택 나는이 같은 SQL 쿼리가 있습니다NHibernate에

select * from dbo.table1 where Id in 
(
    select max(id) as id from dbo.table1 group by prop1, prop2, prop3 
) 

나는이 나를 위해 할 수있을 것입니다 NHibernate에 쿼리를 만들려고합니다. QueryOver을 사용해 보았지만 작동하지 않습니다. 그것을하는 방법에 대한 제안이 있습니까?

답변

3

NHibernate는 이런 종류의 쿼리조차도 지원합니다. 자세한 내용은 15.8. Detached queries and subqueries 문서를 참조하십시오. 우리는 두 부분으로 (당신의 SQL 조각 같이)를 쿼리 을 분할 할 수 있습니다

  • 내부를 선택

이의 가정하자 IN 절과 선택, 그 dbo.table1에서 Questin은 MyEntity에 매핑됩니다.

그룹화 SQL 투사 모두 지정 : 선택 내부 만들려면의이 (가 그룹으로 확장, SqlGroupProjection)를 DetachedCriteria

편집

SqlGroupProjection 방법의 추출물이 있습니다를 사용하자 절 조각

// inner select 
DetachedCriteria innerSelect = DetachedCriteria 
    .For(typeof(MyEntity)) 
    .SetProjection(
     Projections.ProjectionList() 
     .Add(
      Projections.SqlGroupProjection(
       " MAX(ID) ",    // SELECT ... max(ID) only 
       " Prop1, Prop2, Prop3", // GROUP BY ... property1, p2... 
       new string[] {"ID"},  // could be empty, while not used for 
       new IType[] { NHibernate.NHibernateUtil.Int32 } // transformation 
      ) 
     ) 
    ; 
에 의해 절 및 그룹을 선택

참고 : 마지막 두 매개 변수까지도 제공했지만이 경우 비어있을 수 있습니다 (new string[], new IType[] {}). 이들은 변환 (데이터에서 엔티티로의 구체화)에만 사용됩니다. 그리고 이러한 경우가, 우리는 단지

// the select with IN clause 
var result = session.CreateCriteria(typeof(MyEntity)) 
    .Add(Subqueries.PropertyIn("ID", innerSelect)) 
    .List<MyEntity>(); 

는 또한 관련 그것에 대해 알고 있지만 15.7. Projections, aggregation and grouping

+0

수 ... 선택 내부 구축하고있다. 문제가 발생하면 DetachedCriteria innerSelect = DetachedCriteria.For (typeof (MyEntity)). SetProjectionList(). (Projections.Max ("ID"))를 추가하십시오. (Projections.GroupProperty ("prop1"))를 추가하십시오; Subqueries.PropertyIn ("ID", innerSelect)를 수행 할 수 없으므로 다음과 같은 SQL 쿼리를 얻을 수 있습니다. select * from dbo.table1 여기서 id는 ( )에서 dbo의 id로 prop1을 선택하십시오. .table1 group by prop1 ) – maciusik

+0

죄송합니다. 내 의견을 끝내기 전에 반품했습니다. – maciusik

+0

방금 ​​내부 선택에 대한 GROUP BY 문을 사용하여 대답을 확장했습니다. 그게 도움이 될까요? –