2009-11-10 2 views
1

J'ai un peu de mal à construire mon objet critère. Normalement, je bâtirai mon cruteria de façon similaire à ceci:Nhiberate Criterion Expression Combiner "ands" et "ors"

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

Ce que je dois faire est de créer un critère qui ressemble plus à ceci:

OÙ ((a.EndDate IS NOT NULL et un .EndDate> = '{Now}') OU a.EndDate IS NULL) AND ((a.SubObject EST PAS NULL ET un.SubObject.SubObjectId = '{Id}') OU un.SubObject EST NULL) ET a.StartDate < = '{Now}'

Oui, je sais que je pourrais juste utiliser le HQL, mais si possible, j'aimerais utiliser le critère à la place. Le sous-objet et enddate peuvent être null et s'ils sont null je veux les inclure dans la sélection, mais si elles ne sont pas nulles, j'ai besoin de les comparer aux valeurs. L'id du sous-objet s'il n'est pas nul et l'heure courante si enddate n'est pas nul. Je sais que j'ai besoin d'une disjonction pour les "OR", mais je ne suis pas sûr de leur placement et de leur classement en ce qui concerne les critères.

Répondre

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