2013-03-04 2 views
0

Я пытаюсь написать связанный подзапрос в, где положение так:Как подзапрос NHibernate в Where where с LINQ?

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, где я был прототипом. Но NHibernate бросает мне эти загадочные ошибки:

ERROR NHibernate.Hql.Parser [(NULL)] - NoViableAltException (86 @ [])

ERROR NHibernate.Hql.Parser [(NULL)] - MismatchedTreeNodeException (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

Это работает (в том смысле, что не будет никаких ошибок NH), но запрос он генерирует выглядит следующим образом: 'выбрать * из документа, где (выберите TOP 1 мля бла-бла) не является нулевым'. Однако мне нужно, чтобы это закончилось с '= 1'. Но это в значительной степени связано с моими первоначальными запросами и ошибками. – Ragesh

0

Возможно, проблема связана с разбором части запроса true == ....

Может хотите попробовать это вместо того, чтобы,

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

Я получаю то, что вы говорите, но дело в том, что 'Result' является bool как в моем классе, так и в таблице базы данных, поэтому я не понимаю, почему я не могу запросить его таким образом. Сказав это, он действительно работает, если я изменил все (как мой класс, так и столбец базы данных) на int и выполнил запрос, как вы показали. Что особенного в 'bool', который заставляет его терпеть неудачу? Опять же, тот же самый запрос отлично работает, если я запускаю его в LinqPad, поэтому я склонен думать, что это действительно что-то ломается в поставщике Linq NHibernate. – Ragesh

+0

В этом случае вам не нужно указывать 'true == ...'. Я обновил свой ответ, чтобы выразить то, что я имею в виду. – rae1

 Смежные вопросы

  • Нет связанных вопросов^_^