У меня есть следующие отображенные классы
Trade { ID, AccountFrom, AccountTo }
Account {ID, Company}
Company {ID}
Теперь я не могу выяснить, что путь выбирает все отрасли где
AccountFrom.Company.ID = X OR AccountTo.Company.ID = X
Я могу добраться И работать с помощью следующего:
criteria.CreateCriteria("AccountFrom").CreateCriteria("Company").Add(Restrictions.Eq("ID", X);
criteria.CreateCriteria("AccountTo").CreateCriteria("Company").Add(Restrictions.Eq("ID", X);
Но как я могу преобразовать это в ИЛИ скорее И. Я использовал Разъединение ранее, но я, может казаться, не знаю, как добавить отдельные критерии, просто ограничения.
Попробуйте:
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>();
Я не думаю, что вам понадобится псевдоним «Компания».
Я думаю, что ваши параметры NHibernate зависят от того, какую версию NHibernate вы используете.
Дизъюнкция = ИЛИ, Конъюнкция = И
.Add(
Expression.Disjunction()
.Add(companyId1)
.Add(companyId2)
)
То же, что и в этом вопросе здесь
Джейми Айдэ только что ответил более подробно ... суть этого выглядит так:
.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<Trade>()
.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<Trade>();