2009-08-26 4 views
12

이것은 분명 할 수 있지만 몇 시간 동안 내 머리를 쾅쾅 대고 있었고 어디서 잘못되었는지 알 수 없었습니다.OR 대신 OR 쿼리 결과가 나오는 NHibernate 분리

NHibernate 쿼리에 OR 조건을 추가하는 테스트를 위해 작은 코드를 실행하려고합니다. 이것은 내가 가지고있는 코드입니다.

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     criteria.Add(Restrictions.Disjunction().Add(criterion)); 
    } 

    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 

ID가 1 - 3 인 모든 테스트 개체를 반환하기를 기대하는 간단한 내용입니다. 그러나 코드를 실행할 때 생성 된 쿼리는 ID가 1이고 ID가 2이고 ID가 3 인 개체를 찾는 것입니다. 놀랍지 않게도 아무 것도 반환하지 않습니다.

매핑이 올바르게 설정되었으므로 (모든 객체를 추가/편집/제거/나열 할 수 있음)이 ID가있는 객체가 있습니다.

나는 분명히 잘못된 것을하고 있습니까? Disjunction을 사용하는 샘플은 온라인에서 모두 본 것처럼 사용합니다. 나는 왜 그것이 AND를 계속 사용 하는지를 알지 못한다.

감사합니다.

답변

16

귀하의 문제는 매번 접합이 반복된다는 사실에 있습니다. 당신이해야 할 것은 :

int[] ids = {1, 2, 3}; 
ICriterion disjunction = Restrictions.Disjunction(); 
foreach (int id in ids) 
{ 
    ICriterion criterion = Restrictions.Eq("Id", id) 
    disjunction.Add(criterion); 
} 
criteria.Add(disjunction); 

이 구문은 조금 잘못 될 수있다 - 나는 원래 코드가 같은 것을 생성 할 하이버 네이트 사람보다는 .NET의

가 명확히 :-) 해요 (의사 코드에서) :

WHERE (OR(ID=1)) AND (OR(ID=2)) AND (OR(ID=3)) 

"OR"에는 아무 것도 없으므로 불일치가 자동으로 생략되었습니다. ChssPly76의 답변에 따라

+1

매직, 치료를했다. 코드를 볼 때 의미가 있습니다. 개별 OR을 "함께 사용"한다고 생각하지 않았습니다. 코드에 대한 유일한 사소한 변경은 다음과 같이 분리를 작성하는 것입니다. 접합 분리 = Restrictions.Disjunction(); (ICriterion에는 '추가'가 없습니다). 감사합니다. –

5

업데이트 코드 :

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 
    Junction disjunction = Restrictions.Disjunction(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     disjunction.Add(criterion); 
    } 
    criteria.Add(disjunction); 


    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 
관련 문제