2010-01-14 2 views
2

NHibernate에서 표현 집합을 어떻게 그룹화 할 수 있습니까? 예를 들어, 나는 그렇게처럼 내 쿼리를 필터링 할 :NHibernate에서 표현식을 어떻게 그룹화합니까?

(ShowOnDate IS NULL OR ShowOnDate <= GETDATE()) AND (ExpirationDate IS NULL OR ExpirationDate >= GETDATE()) 

나는 별도로 4 criterions에 추가 할 수 있습니다,하지만 난 paranthesis 그룹화를 에뮬레이션하는 방법을 알아낼 수 없습니다. 감사!

내 최종 솔루션 보여 편집 :

  result = this.Session.CreateCriteria<Model.News>() 
       .Add(Expression.IsNull("ExpirationDate") || Expression.Gt("ExpirationDate", DateTime.Now.Date)) 
       .Add(Expression.IsNull("ShowOnDate") || Expression.Le("ShowOnDate", DateTime.Now.Date)) 
       .AddOrder(new Order("SubmittedDate", true)) 
       .List<Model.News>(); 
+0

그것 명확하지 Restrictions.And하고 아니면 두 식을 결합해야하는 경우에이 on은 HQL 또는 Criteria API와 관련이있다. 그럼에도 불구하고 나는 그것이 어떤 용도로 사용되는 경우에 Criteria 관점에서 대답했다. –

+0

나는 Criteria를 의미했다 ... 당신의 대답에 감사드립니다! –

답변

4

기준의 API가 연산자 오버로드를 제공합니다 || 및 & &는이 같은 기준을 결합 할 수 있도록 : 당신이 다음 오버로드 된 연산자를 피하려면

 
criteria.Add(
    (Restrictions.IsNull("ShowOnDate") 
     || Restrictions.Le("ShowOnDate", DateTime.Now)) 
    && (Restrictions.IsNull("ExpirationDate") 
     || Restrictions.Ge("ExpirationDate", DateTime.Now))); 

당신은 (상세에 큰 증가) 동일한 영향을 달성하기 위해 연동 해/분리를 사용할 수 있습니다

 
criteria.Add(Restrictions.Conjunction() 
    .Add(Restrictions.Disjunction() 
     .Add(Restrictions.IsNull("ShowOnDate")) 
     .Add(Restrictions.Le("ShowOnDate", DateTime.Now)))) 
    .Add(Restrictions.Disjunction() 
     .Add(Restrictions.IsNull("ExpirationDate")) 
     .Add(Restrictions.Ge("ExpirationDate", DateTime.Now))))); 
+0

+1 오버로드에 대해 몰랐습니다. | &&. 이 쿼리의 경우 Restrictions.And 및 .Or 대신 사용할 수 있습니다. Conjuction과 Disjunction은 두 가지 이상의 표현식을 비교해야 할 때 사용됩니다. – dotjoe

+0

완벽한. 굉장한 대답. 감사! dotjoe, 제안의 코드 샘플을 제공해 주시겠습니까? 나는 그것을 upvote 것입니다. –

+0

확실한 ... 나는 10 점을 주겠다. 롤 – dotjoe

2

...이 questi 여부

criteria 
    .Add(Restrictions.Or(Restrictions.IsNull("ShowOnDate"), Restrictions.Le("ShowOnDate", DateTime.Now))) 
    .Add(Restrictions.Or(Restrictions.IsNull("ExpirationDate"), Restrictions.Ge("ExpirationDate", DateTime.Now))); 
+0

새내기 질문 - 너와 같은 제약을 사용하는 것의 차이점은 무엇인가? –

+0

Hibernate는 표현식을 semi-deprecated https://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Expression.html로 나열하지만 이것은 NHibernate이므로 왜 그런지 모르겠다. – dotjoe

+0

흥미 롭습니다. 나는 표현이 새롭고 제한이 오래되었다고 생각했습니다. 나는 그것을 되 찾을 것임에 틀림 없다. 나는 정말로 더 많은 것을 배울 필요가있다 ... –

관련 문제