2009-11-24 2 views
1

부모 - 자식 테이블 관계가 있습니다 : 요소 - (1 - n) -> ContentBlocks. 각 ContentBlock 행은 고유 Id (Id), ElementId, Version 및 관련이 적은 필드를 포함합니다. 가장 높은 버전 번호 (및 ID)를 가진 모든 Content 행을 가져 오려고합니다.NHibernate : "IN"을 CreateCriteria와 함께 사용하는 방법?

내가 원하는 걸주는 SQL의이 라인이 : 어떻게

SELECT * FROM ContentBlocks WHERE Id IN 
    (SELECT MAX(Id) FROM ContentBlocks GROUP BY ElementId) 

그러나

(이 최신 버전이 가장 높은 ID를 가지고 있다고 가정)을, 나는 알아낼 수 없습니다 NHibernate에서 가져와. 내가 얻은 가장 가까운 것입니다 :

var subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(Projections.Max("Id")) 
      .SetProjection(Projections.GroupProperty("ElementId")); 

var query = session.CreateCriteria<ContentBlock>() 
      .Add(Subqueries.PropertyIn("Id", subquery)).List<ContentBlock>(); 

만약 내가 하위 쿼리를 실행하면 테이블에있는 고유 한 ElementIds의 목록을 얻습니다. 대신 최신 ContentBlock의 ID 목록이 필요합니다. 하위 쿼리에서 SetProjections의 순서를 바꾼 경우 ElementId의 최대 값을 얻습니다.

나는이 방법을 시도 :

 subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.Max("Id")) 
        .Add(Projections.GroupProperty("ElementId")) 
       ); 

을하지만 그게 2 개 요소, 아이디 & elementId로부터의 CreateCriteria 호출 할 수없는 프로세스 나에게 배열의 목록을 가져옵니다.

그룹화 된 속성 "ElementId"를 결과에 포함하지 않을 방법이 있습니까? 아니면 Max (Id)를 반환하겠습니까?

답변