Nhibernate标准表达结合“ands”和“ors”

时间:2009-11-10 19:46:04

标签: c# nhibernate criteria expression

我在构建标准对象时遇到了一些麻烦。通常情况下,我会像这样建立我的生活:

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 IS NOT NULL AND   a.EndDate> ='{Now}')或a.EndDate IS   NULL)AND((a.SubObject IS NOT NULL   AND a.SubObject.SubObjectId ='{Id}')   或者a.SubObject IS NULL)AND   a.StartDate< ='{Now}'

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

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

我知道我需要断开“OR”的分离,但就标准而言,我只是不确定它们的位置和顺序。

1 个答案:

答案 0 :(得分: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>();