我在构建标准对象时遇到了一些麻烦。通常情况下,我会像这样建立我的生活:
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”的分离,但就标准而言,我只是不确定它们的位置和顺序。
答案 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>();