2013-03-04 2 views
0

나는에 상관 하위 쿼리를 작성하는 노력하고있어이 같은 조항은 어디에 :LINQ가있는 Where 절의 Hibernate 하위 쿼리 방법은 무엇입니까?

var foo = from d in session.Query<Document>() 
      where true == 
       (from a in session.Query<ACLEntry>() 
       where a.Id == d.Id || a.Id == null 
       select a.Result 
      ).FirstOrDefault() 
      select d; 

예상 SQL 출력이 this unanswered question on SO 매우 유사하다.

Linq 문 자체가 괜찮 았다고 생각합니다. 프로토 타입을 작성한 LinqPad에서 실행할 수 있기 때문입니다. ([] @ 86) NoViableAltException

오류 NHibernate.Hql.Parser [(널)] - - MismatchedTreeNodeException

오류 NHibernate.Hql.Parser [(널)] :하지만 NHibernate에 나에게이 신비 오류가 발생합니다 (72! = 3)

NHibernate LINQ 공급자가 지원되지 않는 시나리오입니까? 이 쿼리를 어떻게 재구성 할 수 있을지에 대한 아이디어가 있습니까?

답변

0

이 대신보십시오 :이 도움이 될 것입니다

var foo = from d in session.Query<Document>() 
      where (from a in session.Query<ACLEntry>() 
        where a.Id == d.Id || a.Id == null 
        select a.Result 
       ).FirstOrDefault() != null 
      select d; 

희망!

+0

, 대신을 시도 할 수도 있습니다 ㅋㅋ) null이 아니야. 그러나 대신'= 1'로 끝내야합니다. 그러나 그것은 원래의 쿼리와 오류로 꽤 돌아 왔습니다. – Ragesh

0

쿼리의 일부분 인 true == ...을 구문 분석하는 데 문제가있을 수 있습니다. 여기서 (TOP 1 어쩌구을 선택`문서 SELECT * FROM :

(의미에서 더 NH 오류가없는) 작동하지만, 쿼리는 다음과 같습니다를 생성
var foo = from d in session.Query<Document>() 
    where (from a in session.Query<ACLEntry>() 
      where a.Id == d.Id || a.Id == null 
      select a.Result 
     ).FirstOrDefault() 
    select d; 
+0

당신이 말하는 것을 얻지 만, 그 결과는 내 클래스와 데이터베이스 테이블 모두에서 부울이므로 그 이유를 이해할 수 없다는 것을 이해할 수 있습니다. 그런 말로하면, 모든 것을 (클래스와 데이터베이스 열 모두) int로 변경하고 표시된 것처럼 쿼리를 실행하면 실제로 작동합니다. 'bool'이 실패하게 만드는 특별한 점은 무엇입니까? LinqPad에서 실행하면 똑같은 질의가 제대로 작동하므로 NHibernate의 Linq 공급자가 실제로 깨뜨리는 것 같아 보입니다. – Ragesh

+0

이 경우'true == ... '를 지정할 필요가 없습니다. 나는 내 뜻을 표현하기 위해 나의 대답을 업데이트했다. – rae1