Критерии Nhibernate извлекают потомка родителя с ограничением на другого потомка родителя - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно иметь возможность написать следующий запрос в качестве критерия.

SELECT hist.*
FROM
    Administration admin
    INNER JOIN Item item ON item.AdministrationId = admin.AdministrationId
    INNER JOIN ItemHistory hist ON hist.ItemId = item.ItemId
WHERE
    item.itemId = @param
    and hist.IsError =
        (
            SELECT (CASE status.errorType
                        WHEN 'Warning' THEN 0
                        ELSE 1
                    END
                   )
            FROM
                AdminStatus status
            WHERE
                status.AdministrationId = admin.AdministrationId
                AND status.Group = 'Issues'
        )

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

var status = DetachedCriteria.For<AdminStatus>("status");
        status.CreateAlias("status.Administration", "admin");
        status.Add(Restrictions.Eq("status.Group", "Issues"));
        status.SetProjection(Projections.Property("AdministrationId"));
        status.SetProjection(Projections.Conditional(
                        Restrictions.Eq("status.errorType", "Warning"),
                        Projections.Constant(0),
                        Projections.Constant(1)));

Но я не уверен, как объединить это с моими основными критериями:

    var criteria = Session.CreateCriteria<ItemHIstory>("hist");
        criteria.CreateAlias("ItemHistory.Item", "item");
        criteria.CreateAlias("item.Administration", "admin");    

1 Ответ

0 голосов
/ 11 февраля 2020

Но я не уверен, как объединить это с моими основными критериями:

Методы из Subqueries класса связывают отдельный подзапрос с основными критериями. Subqueries.PropertyEq в вашем случае:

var criteria = Session.CreateCriteria<ItemHIstory>("hist");
criteria.CreateAlias("ItemHistory.Item", "item");
criteria.CreateAlias("item.Administration", "admin");
criteria.Add(Subqueries.PropertyEq("hist.IsError ", status))

И в отношении отдельных критериев. Создание псевдонима кажется ненужным:

var status = DetachedCriteria.For<AdminStatus>("status");

status.Add(Restrictions.EqProperty("status.AdministrationId", "admin.AdministrationId"));
status.Add(Restrictions.Eq("status.Group", "Issues"));

status.SetProjection(Projections.Conditional(
                Restrictions.Eq("status.errorType", "Warning"),
                Projections.Constant(0),
                Projections.Constant(1)));
...