将HQL转换为另一个nHibernate查询表单

时间:2012-01-30 15:18:43

标签: c# linq nhibernate

HQL查询是:

from BusinessObject as businessobject
    left outer join businessobject.BussinesPartner as businesspartner
    left outer join businessobject.Document as document
    left outer join businessobject.Group as group ";
where businessobject.Date >= :datefrom and businessobject.Date <= :dateto
     and (:filter = ''
          or :filter is null 
          or businesspartner.Name like '%' || :filter || '%'
          or group.Name like '%' || :filter || '%'
          or document.Name like '%' || :filter || '%')

我不想使用HQL。我还想要一个强类型的结果集合,而不使用不方便且凌乱的SetResultTransformer。我更喜欢使用Query&lt;&gt;(),但我不知道如何强制使用外连接。

当我在Query&lt;&gt;()表单中写这个时,它不会返回日期在正确范围内的结果和filter =&#34;&#34;例如,如果BusinessPartner为null。而&#34;其中&#34;对于这些对象,逻辑表达式是正确的,因为使用了内连接,它们看起来无论如何都不在结果集中:

session.Query<BusinessObject>()
       .Where(x =>
             (x.Date >= criteria.DateFrom && x.Date <= criteria.DateTo
          && (criteria.Filter == ""
             || x.BusinessPartner.Name.Contains(criteria.Filter)
             || x.Group.Name.Contains(criteria.Filter)
             || x.Document.Name.Contains(criteria.Filter))))

这不起作用,因为不会返回引用BusinessPartner,Group或Document的字段中具有null的任何行(表示内部联接)。

是否可以使用Query&lt;&gt;()执行我想要的操作?或者使用Criteria?

1 个答案:

答案 0 :(得分:1)

我不知道Query&lt;&gt;()但是使用Criteria可以控制JOIN的类型并使用CreateAlias获得强类型结果。

ICriterion conjunction = Restrictions.Conjunction();
conjunction.Add(Restrictions.Contains(criteria.Filter),"BusinessPartner.Name");
conjunction.Add(Restrictions.Contains(criteria.Filter),"Group.Name");
conjunction.Add(Restrictions.Contains(criteria.Filter),"Document.Name");

 ICriteria query = ICriteria.CreateCriteria
.CreateAlias("BusinessPartner", "BusinessPartner", JoinType.LeftOuterJoin)
.CreateAlias("Group", "Group", JoinType.LeftOuterJoin)
.CreateAlias("Document", "Document", JoinType.LeftOuterJoin)
.Add(Restrictions.Between(criteria.DateFrom,criteria.DateTo),"Date")
.Add(conjunction));

List<BusinessObject> results = query.List<BusinessObject>();