부모 - 자식 테이블 관계가 있습니다 : 요소 - (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)를 반환하겠습니까?