【问题标题】:NHibernate Left Outer JoinNHibernate 左外连接
【发布时间】:2011-02-14 21:59:23
【问题描述】:
我希望创建一个左外连接 Nhibernate 查询,其中包含多个类似于此的 on 语句:
SELECT
*
FROM [Database].[dbo].[Posts] p
LEFT JOIN
[Database].[dbo].[PostInteractions] i
ON
p.PostId = i.PostID_TargetPost And i.UserID_ActingUser = 202
我一直在玩弄标准和别名,但我没有任何运气弄清楚如何做到这一点。有什么建议吗?
【问题讨论】:
标签:
nhibernate
criteria
left-join
【解决方案1】:
我真的想通了。您需要检查 null
.CreateCriteria("Interactions", "i", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Expression.Or(Expression.Eq("i.ActingUser", user), Expression.IsNull("i.ActingUser")))
这会在 targetpost id 上创建一个左连接,然后消除所有非 null/非用户交互。
【解决方案2】:
我花了很长时间检查各种不符合我需要的帖子,而您的帖子最接近我正在寻找的内容。
根据我的测试(使用 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
玩得开心!