NHIbernate OR Criteria Query

我有以下映射类

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

现在我无法弄清楚选择所有交易的方式

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

我可以使用以下方法让AND工作:

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

但是我如何将其转换为OR而不是AND。 我之前使用过Disjunction,但我似乎不知道如何添加单独的标准,只是限制。

尝试:

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

我认为你不需要别名公司。

我认为您的NHibernate选项取决于您使用的NHibernate版本。

Disjunction = OR,Conjunction = AND

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

这个问题与此问题相同


Jamie Ide刚刚回答得更彻底……它的要点是这样的:

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

使用Linq到NHibernate:

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

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