NHibernate QueryOver с левыми соединениями
Это заняло у меня несколько дней, и я надеюсь, что кто-то из гуру NHibernate сможет мне помочь. У меня настроен запрос, который работает в SQL Server, и я хочу получить то же самое в NHibernate. Но все мои попытки (я много гуглил и просматривал в stackru) пока не увенчались успехом. Вот запрос:
Select
j.id,
j.title,
j.company,
jt.name as category,
loc.city,
je.is_assigned,
FROM job j
LEFT JOIN location loc ON loc.id = j.location
LEFT JOIN job_tag jt ON jt.job = j.id
and jt.name in (SELECT name FROM tag WHERE tag_category=''Jobtype'')
LEFT JOIN job_employee je ON je.job = j.id
and je.employee_uid = <string>
Я бы предпочел использовать QueryOver, но был бы рад получить рекомендации от вас, ребята!
РЕДАКТИРОВАТЬ: То, что у меня есть, довольно просто...
JobEmployee jobEmployee = null;
Location loc = null;
JobTag jobTag = null;
session.QueryOver<Job>()
.JoinAlias(x => x.location, () => loc)
.JoinAlias(x => x.tags, () => jobTag, JoinType.LeftOuterJoin,
Restrictions.On(jobTag.name).IsIn(<subquery>))
.List();
Но есть ошибки типа "делегат.... не принимает 1 аргумент".
С наилучшими пожеланиями, Мартин
1 ответ
Решение
Вот черновик решения... Сначала подзапрос:
var subquery = QueryOver
.Of<Tag>()
.Where(t => t.TagCategory == "Jobtype")
.Select(t => t.Name);
А теперь мы будем использовать подзапрос в withClause
:
JobEmployee jobEmployee = null;
Location loc = null;
JobTag jobTag = null;
var list = session
.QueryOver<Job>()
.JoinAlias(x => x.location, () => loc)
.JoinAlias(x => x.tags, () => jobTag, JoinType.LeftOuterJoin,
// instead of this
// Restrictions.On(jobTag.name).IsIn(<subquery>))
// use this
Subqueries.WhereProperty(() => jobTag.name).In(subquery)
)
.List();
Итак, мы отфильтровали JOIN, используя withClause и Subqueries