【问题标题】:Nhibernate Criteria retrieve child of parent with restriction on other child of parentNhibernate Criteria检索父母的孩子,限制父母的其他孩子
【发布时间】:2020-05-26 06:24:48
【问题描述】:

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

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-criteria


    【解决方案1】:

    但我不确定如何将其与我的主要标准结合起来:

    来自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)));
    

    【讨论】:

    • 完美运行。我只是不明白“子查询类中的方法将子查询与主要条件分离”这句话。
    • 只是表示子查询类中有很多方法可以用来连接主要条件和子查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多