Движок NHibernate Criteria с внутренним соединением и подзапросом - PullRequest
0 голосов
/ 27 октября 2011

Возможно ли в NHibernate создать запрос, похожий на этот?

select hi.ContactId
From dbo.vw_HostInterests hi INNER JOIN
    (  Select cm1.ContactId
        From dbo.vw_ContactMoments cm1 INNER JOIN
            (
                Select Contactid
                From dbo.vw_ProfileNaw
                where GenderId = 1000
            ) as pn1 on cm1.ContactId = pn1.ContactId
        where cm1.ActivityId = 1001
    )as cm on hi.ContactId = cm.ContactId

где hi.ActivityId = 1038

Мне удалось создать правильный вывод с помощью оператора IN, но мне бы очень хотелось, чтобы SQL выглядел так. Приведенные ниже критерии показывают часть вышеприведенного запроса с оператором IN, который я использовал (но хочу заменить):

ICriteria criteria = DbSession.CreateCriteria<Contact>();

var dCriteria1 = DetachedCriteria.For(typeof(VwHostInterest))
    .Add(Expression.Eq("ActivityId", 1038))
    .SetProjection(Projections.ProjectionList()
    .Add(Projections.GroupProperty("ContactId")));

var dCriteria2 = DetachedCriteria.For(typeof(VwContactMoment))
    .Add(Expression.Eq("ActivityId", 1001))
    .SetProjection(Projections.ProjectionList()
    .Add(Projections.GroupProperty("ContactId")));

criteria.Add(Subqueries.PropertyIn("ContactId", dCriteria1));
criteria.Add(Subqueries.PropertyIn("ContactId", dCriteria2));

int count = (Int32)criteria
    .SetProjection(Projections.Count("ContactId"))
    .UniqueResult();

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Дает ли этот вложенный запрос тот же результат, что и следующий?

SELECT hi.ContactId
FROM dbo.vw_HostInterests hi 
INNER JOIN vw_ContactMoments cm1 on hi.ContactId = cm1.ContactId
    AND cm1.ActivityId = 1001
INNER JOIN dbo.vw_ProfileNaw pn1 on pn1.ContactId = cm1.ContactId
    AND pn1.GenderId = 1000   
WHERE hi.ActivityId = 1038   
0 голосов
/ 27 октября 2011

Вероятно, не тот ответ, который вы ищете, и извинения, если это не так, но мой опыт показывает, что вам лучше всего делать такие сложные запросы:

a) Делать все это в качестве представления иотобразите его в NHibernate

b) Создайте внутренний выбор как представление и создайте отображение таким образом, чтобы вы могли связать его в своем запросе

b) Или переопределить nhibernate (переопределить, как при пропуске, а нев терминах ОО;) и запишите это как именованный запрос, используя собственный SQL.

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