비슷한 질문을 보았지만 간단한 설명을 찾을 수 없습니다. 나는 그것을 놓칠 수 있었지만 나는 보았다고 약속한다. 실제로 나는 모든 것을 빠르게 채색하고 다른 형태의 NH에 익숙하다고 가정하는 단일 블로그 게시물 이외의 다른 문서도 찾을 수 없습니다.NHibernate QueryOver 하위 쿼리
감안할 때 대다, 나는 아마도 하위 주제를 포함하여 주어진 Topic
에 대한 모든 Programs
를 검색 할 후자는 Topics
의 계층 구조에 Program
와 Topic
사이. 주어진 부모 주제의 여러 하위 주제에 프로그램이 나열 될 수 있으므로 하위 쿼리를 사용하거나 별개의 것을 사용해야하는 경우를 고려해야합니다 (간단한 접근 방식 인 TransformUsing(Transformers.DistinctRootEntity)
이 작동하지 않음). 결과는 뷰에 전송 모델 유형에 던져 무언가
SELECT ProgramId, Title, bar, baz, foo FROM Programs
WHERE ProgramId IN
(SELECT ProgramId from Program_Topics WHERE TopicId IN (1, 2, ...))
처럼
원시 SQL이 있어야한다. 내 최초의 시도가이 있었다 :
ProgramDTO pDTO = null;
/* topicIds is List<int> passed into function */
var query = Session.QueryOver<Program>()
.JoinQueryOver<Topic>(p => p.Topics)
.WhereRestrictionOn(pt => pt.Id).IsInG<int>(topicIds)
.TransformUsing(Transformers.DistinctRootEntity)
.SelectList(list => list
.Select(program => program.Id).WithAlias(() => pDTO.Id)
.Select(program => program.Title).WithAlias(() => pDTO.Title)
.Select(program => program.Location).WithAlias(() => pDTO.Location)
.Select(program => program.Description).WithAlias(() => pDTO.Description)
)
.TransformUsing(Transformers.AliasToBean(typeof(ProgramDTO)));
return query.List<ProgramDTO>();
는 분명히 이것은 대신 하위 쿼리의 조인 실행,하지만 난에 하위 쿼리를 수행하는 예를 찾을 수없는 대다이있다.
public class Program : Entity {
public virtual ISet<Topic> Topics { get; protected internal set; }
...
}
public class Topic : Entity {
public virtual ISet<Program> Programs { get; protected internal set; }
public virtual Topic ParentTopic { get; protected internal set; }
...
}
이것은 실제로 당신이 대답이 아닙니다. 당신이 피하고 싶었던 조인을 생성합니다. 문제가 쉽게 해결되는 대신 손으로 직접 작성한 HQL 쿼리를 사용하기로했습니다. – Oliver
HQL 쿼리를 직접 작성하면 강력한 타이핑 및 리팩토링을 포기하므로 QueryOver의 주요 이점입니다. 추가 JOIN을 생성하는 동안 SQL 쿼리 최적화 프로그램은 JOIN 절을 읽고 대신 해당 필드를 선택하여 동일한 결과를 얻을 수있는 추가 테이블이 필요 없음을 알게 될 것으로 기대합니다. 그 밖의 것이 없다면 먼저 WHERE를 실행 한 다음 인덱스에 조인 할 것이므로 빠를 것입니다. –
SQL Server에서 SQL 코드를 실행할 수 있다는 가능성과 가능한 최적화 가능성에 대한 지식이 부족하므로 너무 많이 의존하지 않는 것이 좋습니다. 하지만 통찰력을 주셔서 감사합니다 :-) – Oliver