Nhibernate Criteria 检索 child of parent,限制其他 child of parent

Nhibernate Criteria retrieve child of parent with restriction on other child of parent

我需要能够将以下查询编写为条件。

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");    

But I'm not sure how to join that with my primary criteria:

来自Subqueries class 的方法将分离的子查询与主要标准粘合在一起。 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)));