【问题标题】:Nhiberate Criterion Expression Combining "ands" and "ors"结合“ands”和“ors”的休眠条件表达式
【发布时间】:2009-11-10 19:46:03
【问题描述】:

我在构建标准对象时遇到了一点麻烦。通常,我构建我的 cruteria 与此类似:

ISession session = GetSession();
ICriteria criteria = session.CreateCriteria(typeof(MyObject))
                .Add(Expression.Gt("StartDate", DateTime.Now.ToUniversalTime()))
                .Add(Expression.Eq("SubObject.SubObjectId", subObjectId))
                .AddOrder(new Order("StartDate", true));

我需要做的是创建一个看起来更像这样的标准:

WHERE ((a.EndDate 不为空并且 a.EndDate >= '{Now}') 或 a.EndDate IS NULL) AND ((a.SubObject IS NOT NULL 和 a.SubObject.SubObjectId = '{Id}') 或 a.SubObject 为空)和 a.StartDate

是的,我知道我可以只使用 HQL,但如果可能的话,我想改用 Critera。

子对象和结束日期可以为空,如果它们为空,我想将它们包含在选择中,但如果它们不为空,我需要将它们与值进行比较。如果子对象不为空,则为子对象的 id,如果 enddate 不为空,则为当前时间。

我知道我需要对“OR”进行析取,但就标准而言,我只是不确定它们的位置和顺序。

【问题讨论】:

    标签: c# nhibernate criteria expression


    【解决方案1】:
    var now = DateTime.Now;
    var myObjects = session
        .CreateCriteria<MyObject>()
        .CreateAlias("SubObject", "so")
        .Add(
            Expression.And(
                Expression.Or(
                    Expression.And(
                        Expression.IsNotNull("SubObject"),
                        Expression.IdEq(10)
                    ),
                    Expression.IsNull("SubObject")
                ),
                Expression.And(
                    Expression.Or(
                        Expression.And(
                            Expression.IsNotNull("EndDate"),
                            Expression.Ge("EndDate", now)
                        ),
                        Expression.IsNull("EndDate")
                    ),
                    Expression.Le("StartDate", now)
                )
            )
        )
        .List<MyObject>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多