2013-03-04 256 views
0

我想在寫相關子查詢的WHERE子句這樣的:如何使用LINQ在Where子句中使用NHibernate子查詢?

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的拋出了我這些神祕的錯誤:

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

錯誤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錯誤),但查詢它會產生這樣的容貌:'SELECT * FROM文件在哪裏(選擇TOP 1嗒嗒等等等等)不是空的。不過,我需要以'= 1'結束。但是這幾乎回到了我原來的查詢和錯誤。 – Ragesh 2013-03-04 17:28:03

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中運行它,完全相同的查詢也可以正常工作,所以我傾向於認爲它確實是NHibernate的Linq提供程序中的一些問題。 – Ragesh 2013-03-05 08:55:28

+0

在這種情況下,你不需要指定'true == ...'。我更新了我的答案以表達我的意思。 – rae1 2013-03-05 18:19:26