Перевод HQL в другую форму запроса nHibernate - PullRequest
1 голос
/ 30 января 2012

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 <> (), но я не знаю, как форсировать внешние объединения.

Когда я пишу это в форме Query <> (), он не вернет результат, для которогодата находится в правильном диапазоне и filter = "", если, например, BusinessPartner имеет значение null.Хотя логическое выражение «где» является истинным для этих объектов, похоже, что они все равно не находятся в результирующем наборе из-за использования внутренних объединений:

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, возвращаться не будет (с указанием внутреннего соединения).

Можно ли делать то, что я хочу, с помощью Query <> ()?Или с критериями?

1 Ответ

1 голос
/ 30 января 2012

Я не знаю о Query <> (), но с помощью ICriteria вы можете контролировать тип 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...