【问题标题】:NHIbernate OR Criteria QueryNHIbernate OR 条件查询
【发布时间】:2011-03-18 23:03:40
【问题描述】:

我有以下映射类

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,但我似乎不知道如何添加单独的条件,只是限制。

【问题讨论】:

    标签: c# nhibernate criteria


    【解决方案1】:

    试试:

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

    我认为您不需要给公司起别名。

    【讨论】:

      【解决方案2】:

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

      析取 = OR,合取 = AND

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

      同题here


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

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

      【讨论】:

      • 但是如何添加嵌套对象呢?我不需要对单个属性的限制,我需要 2 个不同属性(在 2 个不同的子类上)之间的 OR
      • 很抱歉,我没有提供详细信息……“Jamie Ide”只是这样做了。这应该是你想要的,也是我应该说的。 .Add(Restrictions.Or( Restrictions.Eq("object1.property1", criteriaValue), Restrictions.Eq("object2.property3", criteriaValue)))
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        相关资源
        最近更新 更多