NHibernate DetachedCriteria - как использовать что-то вроде NVL Oracle на внешнем соединенном множестве - PullRequest
0 голосов
/ 08 апреля 2009

Я хотел бы создать DetachedCriteria, который будет выполнять что-то похожее на следующий код SQL:

select *
FROM PRICELIST pl
LEFT OUTER JOIN PRICELISTDURATIONSHIFT sh ON sh.PRICELISTID = pl.ID
WHERE sh.CUSTOMERID = :cust
  AND nvl(sh.DATEFROM, pl.DATEFROM) <= :dt
ORDER BY nvl(sh.DATEFROM, pl.DATEFROM) DESC

Я могу присоединиться к классу / таблице PriceListDurationShift влево-наружу и добавить ограничение Customer, но я не могу понять, как добавить что-то вроде nvl (sh.DATEFROM, pl.DATEFROM ) <=: ограничение dt. </p>

Буду признателен за любые советы для этого образца, а также за советы по материалам NHibernate по расширенным запросам DetachedCriteria.


надеюсь, это сработает:

var priceLists = priceListRepo.FindAll(DetachedCriteria.For<PriceList>("pl")
    .CreateCriteria((PriceList x) => x.PriceListDurationShifts, () => shift,
        JoinType.LeftOuterJoin)
    .Add<PriceListDurationShift>(x => x.Customer == cust)
    .Add(Expression.Or(
        Expression.And(Restrictions.IsNull("shift.DateFrom"),
            Restrictions.Le("pl.DateFrom", dt.DateTo)),
        Expression.And(Restrictions.IsNotNull("shift.DateFrom"),
            Restrictions.Le("shift.DateFrom", dt.DateTo))
        ))
    )
    .ToList();

1 Ответ

1 голос
/ 08 апреля 2009

Я тоже искал что-то подобное, но не нашел решения.

Тем временем я решил эту проблему, используя HQL вместо Criteria API.

В HQL есть метод coalesce, который можно использовать для этой цели.

from PriceList as pl
left join pl.PriceListDurationShift as shift
where coalesce (shift.DateFrom, pl.DateFrom) <= :dt
order by coalesce (shift.DateFrom, pl.DateFrom) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...