2010-07-21 9 views
9

Ich habe folgende abgebildet KlassennHibernate oder Kriterien Abfrage

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

Jetzt kann ich alle Trades heraus nicht einen Weg wählen, wo

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

ich bekommen kann und arbeiten mit dem folgenden:

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

Aber wie kann ich das in ein OR eher ein UND verwandeln. Ich habe Disjunktion schon früher benutzt, aber ich kann nicht scheinen, wie man getrennte Kriterien, nur Beschränkungen hinzufügt.

+1

Sollte es AccountFrom.Company.ID = X OR AccountTo.Company.ID = X lesen ?? wie Ihre Frage keinen Sinn macht, wie es ist – Rippo

+0

Opps, ja Ihre richtige –

Antwort

23

Versuchen:

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

Ich glaube nicht, dass Sie Alias ​​Company werden müssen.

+0

Ahh Dank, müssen Sie Aliasnamen zuerst erstellt! Didn‘ Ich weiß das. Danke –

5

Ich denke, dass Ihre NHibernate-Optionen davon abhängen, welche Version von NHibernate Sie verwenden.

Disjunction = OR, Conjunction = AND

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

Gleiche wie diese Frage here


Jamie Ide nur gründlicher beantwortet ... der Kern von ihm so geht:

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

Aber wie füge ich verschachtelte Objekte hinzu? Ich brauche keine Einschränkungen für eine einzelne Eigenschaft, ich brauche ein OR zwischen 2 verschiedenen Eigenschaften (für 2 verschiedene Unterklassen) –

+0

Es tut mir leid, dass ich keine Details angegeben habe ... 'Jamie Ide' tat es nur. Das sollte sein, was du willst und was ich hätte sagen sollen. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

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

HQL verwenden:

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