我正在寻找使用类似于此的多个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和别名,但我还没有弄清楚如何做到这一点。有什么建议吗?
答案 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函数造成重载。这对我来说非常有效,我相信它也是你所寻找的。 p>
我知道这个话题已经很老了,但是如果它可以帮助其他人......
另外,关于nHibernate查询的很好的例子(这对我来说是一个巨大的帮助):http://ayende.com/blog/4023/nhibernate-queries-examples
玩得开心!