NHibernate左外连接

时间:2010-05-03 04:43:42

标签: nhibernate criteria left-join

我正在寻找使用类似于此的多个on语句创建一个Left outer join Nhibernate查询:

SELECT 
    * 
FROM [Database].[dbo].[Posts] p
LEFT JOIN 
    [Database].[dbo].[PostInteractions] i
ON 
   p.PostId = i.PostID_TargetPost And i.UserID_ActingUser = 202       

我一直在讨论critera和别名,但我还没有弄清楚如何做到这一点。有什么建议吗?

2 个答案:

答案 0 :(得分:12)

我实际上已经明白了。你需要检查null

.CreateCriteria("Interactions", "i", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
            .Add(Expression.Or(Expression.Eq("i.ActingUser", user), Expression.IsNull("i.ActingUser")))

这会在targetpost id上创建一个左连接,然后消除所有非null /非用户交互。

答案 1 :(得分:0)

我花了很长时间检查那些没有做我需要的帖子,你的帖子最接近我想要的。

从我的测试(使用nHibernate 3),您的查询不正确。实际上你的标准在SQL中看起来更像这样:

SELECT * 
FROM [Posts] p
LEFT JOIN [PostInteractions] i
   ON p.PostId = i.PostID_TargetPost
WHERE (i.UserID_ActingUser = 202 OR i.UserID_ActingUser IS NULL)

仅当交互的ActingUser为202或该帖子不存在交互时才会返回帖子/互动。

经过更多的测试后,我终于明白了......

试试这个(vb.net):

session.CreateCriteria(Of Posts)("p") _
.CreateCriteria("Interactions", "i", _
                NHibernate.SqlCommand.JoinType.LeftOuterJoin, _
                Expression.Eq("i.ActingUser", user))

使用" withClause"对CreateCriteria函数造成重载。这对我来说非常有效,我相信它也是你所寻找的。

我知道这个话题已经很老了,但是如果它可以帮助其他人......

另外,关于nHibernate查询的很好的例子(这对我来说是一个巨大的帮助):http://ayende.com/blog/4023/nhibernate-queries-examples

玩得开心!