2010-07-21 2 views
9

나는이NHibernate에 OR 조건 쿼리

Trade { ID, AccountFrom, AccountTo } 
Account {ID, Company} 
Company {ID} 

가 지금은

AccountFrom.Company.ID = X OR AccountTo.Company.ID = X 

내가 얻을 수 및 사용하여 다음 작업을 모든 거래를 선택하는 방법을 알아낼 수 없습니다 다음 매핑 클래스 :

criteria.CreateCriteria("AccountFrom").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 
criteria.CreateCriteria("AccountTo").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 

하지만 이것을 어떻게 AND로 변환 할 수 있습니까? 이전에 Disjunction을 사용했지만 분리 기준, 제한 사항을 추가하는 방법을 알 수없는 것 같습니다.

+1

그것이 AccountFrom.Company.ID = X OR AccountTo.Company.ID = X를 읽어야 ?? 당신의 질문이 이해가 안되기 때문에 – Rippo

+0

Opps, 맞습니다. –

답변

23

시도해보기 :

return session.CreateCriteria<Trade>() 
    .CreateAlias("AccountFrom", "af") 
    .CreateAlias("AccountTo", "at") 
    .Add(Restrictions.Or(
     Restrictions.Eq("af.Company.CompanyId", companyId), 
     Restrictions.Eq("at.Company.CompanyId", companyId))) 
    .List<Trade>(); 

회사의 별명을 지정할 필요가 없습니다.

var X = 0; // or whatever the identifier type. 
var result = Session.Linq<Trade>() 
       .Where(trade => trade.AccountFrom.Company.ID == X || 
           trade.AccountTo.Company.ID == X) 
       .ToList(); 

을 HQL을 사용하여 : NHibernate에 Linq에 사용

+0

아 덕분에, 먼저 별칭을 만들어야합니다! 'didn를 그걸 알아. 고마워. –

5

당신의 NHibernate 옵션은 당신이 사용하고있는 NHibernate의 버전에 달려 있다고 생각합니다.

분리 = OR, 접속사 = AND

제이미 이데 단지 더 철저하게 대답 here


이 ... 그것의 요점은 다음과 같이 진행이 질문에 같은

.Add(
    Expression.Disjunction() 
    .Add(companyId1) 
    .Add(companyId2) 
) 

같은 :

.Add(Restrictions.Or(
    Restrictions.Eq("object1.property1", criteriaValue), 
    Restrictions.Eq("object2.property3", criteriaValue)) 
+0

하지만 중첩 된 객체는 어떻게 추가합니까? 단일 속성에 대한 제한이 필요하지 않습니다. 2 가지 하위 속성간에 OR이 필요합니다. –

+0

세부 정보를 제공하지 않아서 미안합니다 ... 'Jamie Ide'가 방금 했어요. 그게 네가 원하는 것과 내가 말했어 야하는 것이어야한다. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

var X = 0; // or whatever the identifier type. 
var hql = "from Trade trade where trade.AccountFrom.Company.ID = :companyId or trade.AccountTo.Company.ID = :companyID"; 
var result = Session.CreateQuery(hql) 
       .SetParameter("companyId", X) 
       .List<Trade>();