2010-05-03 44 views
5

tôi đang tìm cách để tạo ra một bên ngoài trái tham gia Nhibernate truy vấn với nhiều trên báo cáo tương tự như này:NHibernate Left Outer Join

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

Tôi đã lãng phí thời gian với với tiêu chí và bí danh, nhưng tôi thiên đường' t có bất kỳ may mắn tìm ra cách để làm điều này. Bất kỳ đề xuất?

Trả lời

12

Tôi thực sự đã tìm ra. Bạn cần phải thực hiện kiểm tra cho số không

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

điều này tạo ra một tham gia trái trên id mục tiêu và sau đó loại bỏ tất cả các tương tác không trống/không của người dùng.

0

Tôi đã dành nhiều thời gian kiểm tra tất cả các loại bài đăng không làm những gì tôi cần và bài đăng của bạn gần nhất với những gì tôi đang tìm kiếm.

Từ các thử nghiệm của tôi (với nHibernate 3) truy vấn của bạn không chính xác. Trên thực tế, tiêu chí của bạn trông giống như thế này trong 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) 

Chỉ trả lại bài viết/tương tác khi người dùng tương tác là 202 hoặc không tương tác với bài đăng.

Sau rất nhiều thử nghiệm hơn Cuối cùng tôi figured it out ...

Hãy thử điều này (vb.net):

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

Có một tình trạng quá tải với chức năng CreateCriteria sử dụng một "withClause". Điều đó làm việc perferctly cho tôi và tôi tin rằng đó là những gì bạn đang tìm kiếm quá.

Tôi biết của chủ đề khá cũ nhưng nếu nó có thể giúp bất cứ ai khác ....

Ngoài ra, đối ví dụ tuyệt vời trên các truy vấn nHibernate (đó là một sự giúp đỡ rất lớn đối với tôi): http://ayende.com/blog/4023/nhibernate-queries-examples

Hãy vui vẻ !