2010-05-03 104 views
5

我希望創建一個左外到這個報表類似於加入NHibernate的查詢與多個:NHibernate的左外連接

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

我已經與性判據和別名打打鬧鬧,但還沒有沒有什麼好運算出如何做到這一點。有什麼建議麼?

回答

12

我其實已經想通了。您需要檢查null

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

這會在targetpost id上創建左連接,然後消除所有非空/非用戶交互。

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)) 

有使用「條款二」給個createCriteria函數的重載。這對我來說是非常有效的,我相信這也正是你想要的。

我知道主題的很老,但如果它可以幫助別人....

此外,有關NHibernate的查詢很好的例子(這對我是一個巨大的幫助):http://ayende.com/blog/4023/nhibernate-queries-examples

玩得開心!