2010-05-03 5 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  

Я дурачиться с critera и псевдонимами, но я гавань» Мне не удавалось выяснить, как это сделать. Какие-либо предложения?

ответ

12

Я действительно понял это. Вам нужно сделать чек на нуль

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

это создает левое соединение на targetpost идентификатору, а затем уничтожает все не нулевые/Non взаимодействия с пользователем.

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 с помощью "withClause". Это работало для меня, и я считаю, что это то, что вы тоже ищете.

Я знаю, что эта тема в довольно старый, но если это может помочь кому-либо еще ....

Кроме того, для больших примеров на запросы NHibernate (это была огромная помощь для меня): http://ayende.com/blog/4023/nhibernate-queries-examples

Весело !

Смежные вопросы