2010-05-03 19 views
5

Sto cercando di creare un join esterno sinistro di query NHibernate con più sulle dichiarazioni di simile a questo:NHibernate sinistra 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  

ho scherzare con il critera e alias, ma mi rifugio' Ho avuto fortuna a capire come fare a questo. Eventuali suggerimenti?

risposta

12

In realtà l'ho capito. Hai bisogno di fare un controllo per nulla

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

questo crea unirsi su targetpost id a sinistra e poi elimina tutti non nulli/interazioni non utenti.

0

Ho passato molto tempo a controllare tutti i tipi di post che non facevano ciò di cui avevo bisogno e il tuo post è il più vicino a quello che stavo cercando.

Dai miei test (con nHibernate 3) la query non è corretta. In realtà i tuoi criteri sembra più presente in 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) 

che restituisce messaggi/interazioni solo quando ActingUser della interazione è 202 o che non esiste alcuna interazione per il posto.

Dopo lotto più test ho finalmente capito che fuori ...

Prova questo (vb.net):

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

C'è un sovraccarico alla funzione createCriteria utilizzando una "withClause". Questo ha funzionato perfettamente per me e credo che sia quello che stai cercando anche tu.

so del tema piuttosto vecchio, ma se può aiutare chiunque altro ....

Inoltre, per grandi esempi sulle query NHibernate (è stato un grande aiuto per me): http://ayende.com/blog/4023/nhibernate-queries-examples

Buon divertimento !