Выражение критерия Nhiberate, сочетающее «и» и «или» - PullRequest
1 голос
/ 10 ноября 2009

У меня небольшая проблема с созданием объекта моего критерия. Как правило, я строю свой кафетерий так:

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));

Что мне нужно сделать, это создать критерий, который будет выглядеть примерно так:

ГДЕ ((. Конечная дата не равна NULL и a.EndDate> = '{Now}') ИЛИ a.EndDate IS NULL) И ((a.SubObject не равен NULL AND a.SubObject.SubObjectId = '{Id}') ИЛИ a.SubObject is NULL) И a.StartDate <= '{Now}' </p>

Да, я знаю, что могу просто использовать HQL, но, если возможно, я бы хотел использовать Critera.

Подобъект и конечная дата могут быть нулевыми, и если они равны нулю, я хочу включить их в выборку, но если они не равны нулю, мне нужно сравнить их со значениями. Идентификатор подобъекта, если он не равен нулю, и текущее время, если конечная дата не равна нулю.

Я знаю, что мне нужно дизъюнкция для "ИЛИ", но я просто не уверен в их размещении и упорядочении в соответствии с критериями.

1 Ответ

1 голос
/ 10 ноября 2009
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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...