2010-07-21 12 views
9

ho le seguenti classi mappateNHibernate o criteri di query

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

Ora non riesco a trovare un modo per selezionare tutti i mestieri in cui

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

posso ottenere e di lavorare utilizzando il seguente:

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

Ma come posso trasformare questo in un OR piuttosto un AND. In precedenza ho usato Disjunction, ma non riesco a capire come aggiungere criteri separati, solo restrizioni.

+1

Qualora l'leggere AccountFrom.Company.ID = X OR AccountTo.Company.ID = X ?? come la tua domanda non ha senso in quanto è – Rippo

+0

Opps, sì il tuo corretto –

risposta

23

Prova:

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

Non credo che sarà necessario per alias Società.

+0

Ahh, grazie, è necessario creare alias prima! Didn' Lo so. Grazie –

5

Penso che le tue opzioni di NHibernate dipendano dalla versione di NHibernate che stai utilizzando.

Disjunction = O, Congiunzione = E

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

Uguale a questa domanda here


Jamie Ide appena risposto più a fondo ... l'essenza di esso va in questo modo:

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

Ma come faccio ad aggiungere oggetti nidificati? Non ho bisogno di restrizioni su una singola proprietà, ho bisogno di un OR tra 2 diverse proprietà (su 2 diverse sottoclassi) –

+0

Mi dispiace di non aver fornito i dettagli ... 'Jamie Ide' lo ha appena fatto. Questo dovrebbe essere quello che vuoi e quello che avrei dovuto dire. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

Utilizzando LINQ to 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(); 

Uso 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>(); 
Problemi correlati