NHibernate левое внешнее соединение - PullRequest
5 голосов
/ 03 мая 2010

Я хочу создать запрос 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       

Я дурачился с critera и псевдонимами, но мне не повезло понять, как это сделать. Есть предложения?

Ответы [ 2 ]

12 голосов
/ 03 мая 2010

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

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

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

0 голосов
/ 19 февраля 2015

Я потратил много времени, проверяя все виды постов, которые не делали то, что мне нужно, и ваш пост ближе всего к тому, что я искал.

Из моих тестов (с 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

Веселись!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...