2009-11-10 3 views
1

기준 개체를 구축하는 데 약간의 문제가 있습니다. 일반적으로,이 유사하게 내 cruteria 빌드 :Nhiberate 기준 표현식 "ands"및 "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)); 

을 내가해야 할 것은 더 다음과 같습니다 기준을 만드는 것입니다 :

((a.EndDate이 NULL AND 해당 없음입니다 .EndDate> = '{Now}') 또는 a.EndDate IS NULL) 및 (a.SubObject가 NULL이 아님 AND a.SubObject.SubObjectId = '{Id}') 또는 a.SubObject가 NULL 임) AND a.StartDate < = '{Now}'

예, HQL을 사용할 수는 있지만 가능한 경우 Critera를 대신 사용하고 싶습니다.

subobject와 enddate는 null 일 수 있으며 null 인 경우 선택에 포함 시키지만 null이 아닌 경우 값과 비교해야합니다. 하위 객체가 null이 아니고 하위 객체의 id가 enddate가 null이 아닌 경우 현재 시간입니다.

나는 "OR"에 대한 분리가 필요하다는 것을 알고 있지만 기준이되는 한 배치 및 정렬에 대해서는 확신 할 수 없습니다.

답변

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