2014-09-29 6 views
1
하위 쿼리

내가 QueryOver에 다음과 같은 SQL로 변환하려고 주요 쿼리의 사용 특성 :NH QueryOver -

Select 1 
From myTable mt 
Where mt.ForeignKey in (select ID from otherTable ot where ot.ID = R.ID) 

를 내가는/NOT EXISTS 문처럼 EXISTS 안에이 하위 쿼리를 사용하려면 :

select * from table R where .... AND EXISTS (query above) 

mainQuery.WithSubquery.WhereExists(QueryOver.Of<myTable>() 
        .Where(mt => mt.ForeignKey) 
        .WithSubquery.IsIn(QueryOver.Of<otherTable>().Where(c => c.Id == R.SomeId))); 

내가 사기 할 하위 쿼리로이 쿼리를 생성 :

현재 내가 무엇인가가 메인 쿼리에 연결하십시오. 문제는 R이라는 별칭을 가진 테이블이 기본 쿼리에서 호출되는 테이블이며 테이블의 열 (NHibernate Model) R (위의 쿼리에서 액세스 할 수 없음)에 액세스하는 방법을 모르겠다는 것입니다. 다음과 같습니다 :

어떻게하면 기본 쿼리에서 값을 가져 와서 하위 쿼리에서 사용할 수 있습니까? 나는 이것이 (mainQuery.WithSubquery.Where (..) 또는 smth. similar와 같이) 서브 쿼리를 인라인으로 만 생성하는 것이 가능하다고 생각하지만 그렇게 할 수있는 최선의 방법이 무엇인지 알 수 없다. 어떤 도움을 주셔서 감사합니다!

미리 감사드립니다.

답변

1

트릭 부모 쿼리에 대한 적절한 별칭을 사용하는 것입니다 : 완전히 mainQuery 부분에 대해 확실하지만, 여기에 일반적으로 해결하지

// the alias 
myTable R = null; 

mainQuery 
    .WithSubquery 
     .WhereExists(QueryOver 
     .Of<myTable>(() => R) // the Alias in place 
     .Where(mt => mt.ForeignKey) 
     .WithSubquery.IsIn(QueryOver.Of<otherTable>().Where(c => c.Id == R.SomeId))); 

참고하면, 다음과 같이이다 :

// I. the outer query ALIAS 
Employee emplyoee = null; 

// II. the subquery - using the alias 
var subQuery = QueryOver.Of<Contact>() 
    .Select(x => x.ID) 
    .Where(x => x.Related.ID == emplyoee.ID); // use alias 

// III. declare the outer query and use the above alias 
var query = session.QueryOver<Employee>(() => emplyoee) // declare alias 
    .WithSubquery 
     .WhereExists(subQuery); // put both together 

자세한 내용은 this을 확인하십시오.

+0

별칭 팁을 가져 주셔서 감사합니다! 여러분의 도움과 코드베이스의 다른 코드를 살펴봄으로써 문제를 해결할 수있었습니다! – Philipp

+0

그레이트 오티 그 참조;) 즐기 NHibernate, 멋진 도구;) –