2010-07-21 11 views
9

Mam następujący odwzorowane klasNHibernate lub kryteriów zapytania

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

Teraz nie mogę wymyślić sposób zaznaczyć wszystkie transakcje gdzie

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

mogę uzyskać i pracy przy użyciu następujących:

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

Ale jak mogę przekształcić to w OR, a raczej ORAZ. Użyłem Disjunction wcześniej, ale nie mogę wiedzieć, jak dodać oddzielne kryteria, tylko ograniczenia.

+1

powinni ją przeczytać AccountFrom.Company.ID = X = X LUB AccountTo.Company.ID ?? ponieważ twoje pytanie nie ma sensu, ponieważ jest to – Rippo

+0

Opps, tak twój poprawny –

Odpowiedz

23

Wypróbuj:

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

Nie sądzę, że konieczne będzie pseudonim Firma.

+0

Ahh dzięki, trzeba tworzyć aliasy pierwszy! Didn” wiem to. Dzięki –

5

Myślę, że twoje opcje NHibernate zależą od wersji NHibernate, której używasz.

alternatywy = OR, Koniunkcja = I

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

samo jak to pytanie here


Jamie Ide właśnie odpowiedział bardziej dokładnie ... sedno To idzie tak:

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

Ale jak mogę dodać zagnieżdżone obiekty? Nie potrzebuję restrykcji na jedną właściwość, potrzebuję OR między 2 różnymi właściwościami (na 2 różnych podklasach). –

+0

Przykro mi, że nie podałem szczegółów ... "Ale Jamie Ide" właśnie tak zrobił. To powinno być to, czego chcesz i co powinienem powiedzieć. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1" criteriaValue) Restrictions.Eq ("object2.property3" criteriaValue)) –

3

użyciu LINQ do NHibernate:

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

Korzystanie HQL:

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>(); 
Powiązane problemy