2012-12-12 2 views
4

nHibernate를 사용하여 렌더링해야하는 SQL 쿼리가 있다고 가정 해 보겠습니다. SQL 쿼리의 WHERE 절은 3 개의 또는 문으로 구성되며 각 문에는 조건 목록이 들어 있습니다. 예를 들어 내가 nHibernate 수있는 QueryOver 구문을 사용하여 쿼리의 동일한 유형을 작성하는 방법nHibernate : QueryOver를 사용하는 결합과 분리

var disjunction = Restrictions.Disjunction(); 

foreach (var tuple in OrdersAndLineItems) 
{ 
    var conjunction = Restrictions.Conjunction(); 
    var order = tuple.Item1; 
    var lineitem = tuple.Item2; 

    conjunction.Add(Restrictions.Eq("OrderId", order.Id)); 
    conjunction.Add(Restrictions.Eq("LineItemId", lineitem.Id)); 

    disjunction.Add(conjunction); 
} 

var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList(); 

:

SELECT * 
FROM MyTable 
WHERE 
    (OrderId = 1 and ItemId = 100) 
    OR 
    (OrderId = 2 and ItemId = 200) 
    OR 
    (OrderId = 3 and ItemId = 300) 

nHibernate 수의 기준 구문을 사용하여, 나는이를 구현하기 위해 분리를 사용할 수 있습니다 3.x?

답변

-3

전혀 신경 쓰지 마라 - 내가 게시 한 직후에 대답을 제공 한 an earlier StackOverflow post을 우연히 발견했다. 여기 QueryOver을 사용하여 다시 작성 내 원래의 예는 구문입니다 :

당신이 평등을 테스트 할 제한 사항
var disjunction = Restrictions.Disjunction(); 

foreach (var tuple in OrdersAndLineItems) 
{ 
    var conjunction = Restrictions.Conjunction(); 
    var order = tuple.Item1; 
    var lineitem = tuple.Item2; 

    conjunction.Add(Restrictions.On<SomeClass>(x => x.OrderId).Equals(order.Id)); 
    conjunction.Add(Restrictions.On<SomeClass>(x => x.LineItemId).Equals(lineitem.Id)); 

    disjunction.Add(conjunction); 
} 

var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList(); 
+0

이것은 올바르지 않습니다. Equals는 객체에 대한 메소드이며 QueryOver API와는 아무런 관련이 없습니다. –

+0

평등 테스트에 대한 올바른 방법은 내 대답을 참조하십시오. –

0

가 사용하는 "경우"예 :

Restrictions.Where<SomeClass>(x => x.OrderId == order.Id) 
1

적어도 Add 메서드의 오버로드 다수가있다 NH 버전 3.0.0.4000. 그들 중 하나는 귀하의 경우에 사용할 수있는 일반적인 매개 변수를 가지고 있습니다. 예를 들면 다음과 같습니다.

disjuction.Add<TypeinWhichPrimaryKeyPropertyExists>(x => x.PrimaryKey == 1) 
관련 문제