代码之家  ›  专栏  ›  技术社区  ›  Josh

结合“Ands”和“Ors”的NHiberate准则表达式

  •  1
  • Josh  · 技术社区  · 15 年前

    我在建立标准对象方面遇到了一些问题。通常情况下,我构建的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));
    

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

    其中((a.enddate不为空且 a.enddate>='现在')或a.enddate是 和((a.SubObject不为空) 和a.SubObject.SubObjectId='id'125;') 或a.SubObject为空)和 a.开始日期<='现在'

    是的,我知道我可以使用hql,但是如果可能的话,我想用critera代替。

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

    我知道我需要一个“或”的分离,但我只是不确定他们的位置和顺序,就标准而言。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Darin Dimitrov    15 年前
    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>();