10

I have the following mapped classes

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

Now I cannot figure out a way select all trades where

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

I can get AND to work using the following:

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

But how can I transform this into an OR rather an an AND. I have used Disjunction previously, but I cannot seem to know how to add separate criteria, just restrictions.

0

3 Answers 3

25

Try:

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

I don't think you will need to alias Company.

Sign up to request clarification or add additional context in comments.

Comments

5

I think your NHibernate options depend on which version of NHibernate that you are using.

Disjunction = OR, Conjunction = AND

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

Same as this question here


Jamie Ide just answered more thoroughly...the gist of it goes like this:

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

2 Comments

But how do I add nested objects? I don't need restrictions on a single property, I need an OR between 2 different properties (on 2 different sub classes)
I'm sorry I didn't give details...'Jamie Ide' just did though. That should be what you want, and what I should have said. .Add(Restrictions.Or( Restrictions.Eq("object1.property1", criteriaValue), Restrictions.Eq("object2.property3", criteriaValue))
3

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

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.