NHibernate 或者 Criteria 查询

10
我有以下映射类。
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,但似乎不知道如何添加单独的条件,只能添加限制。

3个回答

25

尝试:

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

我认为你不需要给 Company 别名。


5
我认为您的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))

但是如何添加嵌套对象呢?我不需要对单个属性施加限制,我需要在2个不同的子类中的2个不同属性之间使用OR。 - Michal Ciechan
很抱歉我没有提供细节,但是'Jamie Ide'已经提供了。那应该是你想要的,也是我应该说的。.Add(Restrictions.Or( Restrictions.Eq("object1.property1", criteriaValue), Restrictions.Eq("object2.property3", criteriaValue)) - The Mirage

3

使用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:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接