如何在LINQ的Where子句中使用NHibernate子查询?

时间:2013-03-04 17:00:18

标签: linq nhibernate linq-to-nhibernate

我试图在where子句中编写相关的子查询,如下所示:

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提供程序不支持的场景吗?关于我如何能够重构这个查询以解决它的任何想法?

2 个答案:

答案 0 :(得分: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;

希望这会有所帮助!!

答案 1 :(得分: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;