【问题标题】: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

      玩得开心!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多