2013-03-04 208 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