【问题标题】:NHibernate Criteria API help needed please请需要 NHibernate Criteria API 帮助
【发布时间】:2011-06-29 18:32:40
【问题描述】:

我正在尝试创建一个标准查询,该查询通过 useruploaded 获取“RejectedRecords”,这些查询未标记为已删除,或者 RejectedRecord 中的设施位于用户分配到的设施列表中 (user.UserFacilities)。我的第一部分工作正常(按用户且未删除),但我不确定如何添加 OR 子句以获取用户设施集合中的记录。在 SQL 中它看起来像:

SELECT * 

FROM RejectedRecords

WHERE (UserUploaded = 1 AND IsDeleted = 0) 
OR FacilityId IN (SELECT FacilityId FROM UserFacility WHERE UserId = 1)

这是我在 C# 中的尝试(不确定如何执行子查询):

    public IList<RejectedRecord> GetRejectedRecordsByUser(User u)
    {
        return base._session.CreateCriteria(typeof(RejectedRecord))
            .Add(
                    (
                        Expression.Eq(RejectedRecord.MappingNames.UserUploaded, u)
                        && Expression.Eq(RejectedRecord.MappingNames.IsDeleted, false)

                    )
            )
            .List<RejectedRecord>();
    }

【问题讨论】:

    标签: nhibernate criteria-api


    【解决方案1】:

    关键是使用Disjunction and Conjunction 结合子查询。

    var facilityIdQuery = DetachedCriteria.For<UserFacility>()
       .Add(Expression.Eq("User.Id", u))
       .SetProjection(Projections.Property("Facility.Id"));
    
    var results = session.CreateCriteria<RejectedRecords>()
        .Add(
            Restrictions.Disjunction()
            .Add(
                Restrictions.And(
                  Restrictions.Eq(RejectedRecord.MappingNames.UserUploaded, u),
                  Restrictions.Eq(RejectedRecord.MappingNames.IsDeleted, false)
                )
            )
            .Add(Subqueries.PropertyIn("FacilityId",facilityIdQuery))
        ).List();
    

    【讨论】:

    • 这个概念是正确的,但我认为你写错了......它应该写成(为简单起见伪代码) Disjunction.Add(Expression.And(Eq.useruploaded, Eq.isdeleted) ).Add(suquery.propertyin)
    • @Jaguar 你是对的,我把链条弄错了。我现在已经编辑了答案并测试了语法和 SQL 的正确性。
    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多