NHibernate QueryOver с подзапросом или другими идеями, как это может работать? - PullRequest
4 голосов
/ 21 июля 2011

У меня есть следующие запросы:

Model.RampActiveHour rah = null;

var defaultWeekQuery = QueryOver.Of<Model.RampAdditionalDefaultWeek>()
                                   .Where(adw => adw.Ramp == rah.Ramp && 
                                          adw.Active && adw.FromDate <= date &&
                                          adw.ToDate >= date)
                                   .Select(adw => adw.ID).Take(1);
var result = session.QueryOver(() => rah)
                .Where(ah => ah.DayOfWeek == date.DayOfWeek)
                .WhereRestrictionOn(ah => ah.Ramp).IsIn((ICollection) ramps)
                .WithSubquery.WhereProperty(ah=>ah.AdditionalDefaultWeek)
                    .Eq(defaultWeekQuery)
                .List();

Результат запроса:

SELECT
 this_.ID as ID3_0_,
 this_.DayOfWeek as DayOfWeek3_0_,
 this_.Active as Active3_0_,
 this_.SlotsCount as SlotsCount3_0_,
 this_.SlotId as SlotId3_0_,
 this_.SlotLength as SlotLength3_0_,
 this_.Date as Date3_0_,
 this_.ramp_id as ramp8_3_0_,
 this_.additional_default_week_id as additional9_3_0_,
 this_.Previous as Previous3_0_,
 this_.Next as Next3_0_ 
FROM RampActiveHour this_ 
WHERE this_.DayOfWeek = 3 /* ?p0 */ and
 this_.ramp_id in (
    3484 /* ?p1 */,
     3498 /* ?p2 */)
 and
     this_.additional_default_week_id = (
        SELECT
             this_0_.ID as y0_ 
        FROM RampAdditionalDefaultWeek this_0_ 
        WHERE (
            (
                (
                    this_0_.ramp_id = this_.ramp_id and
                         this_0_.Active = 1 /* ?p103 */)
                     and
                         this_0_.FromDate <= '2011-07-20T00:00:00.00' /* ?p104 */)
                     and
                         this_0_.ToDate >= '2011-07-20T00:00:00.00' /* ?p105 */)
                     limit 1 /* ?p106 */)

Запрос правильный.Проблема состоит в том, что в моей модели у меня есть свойство в RampActiveHour, называемое AdditionalDefaultWeek, и это свойство отображается в таблицу RampAdditionalDefaultWeek со многими в один.Это отношение многие к одному может быть нулевым (что означает, что дополнительная неделя по умолчанию отсутствует) или может быть установлено в int (что означает, что активная дополнительная неделя по умолчанию активна).

Проблема заключается в том, что при наличииno active AdditionalDefaultWeek подзапрос не возвращает пустое множество, и по этой причине весь запрос возвращает пустое множество.

Я думал о проекциях. Условные проекции, но все же могу это сделать.

Любая помощьочень признателен.

Спасибо.

1 Ответ

9 голосов
/ 21 июля 2011
var result = session.QueryOver(() => rah)
            .Where(ah => ah.DayOfWeek == date.DayOfWeek)
            .WhereRestrictionOn(ah => ah.Ramp).IsIn((ICollection) ramps)
            .WithSubquery.WhereProperty(ah=>ah.AdditionalDefaultWeek).Eq(defaultWeekQuery)
            .Where(new Disjunction()
                .Add(Subqueries.WhereProperty(ah=>ah.AdditionalDefaultWeek).Eq(defaultWeekQuery))
                .Add(new Conjunction()
                    .Add(Subqueries.WhereNotExists(defaultWeekQuery))
                    .Add(Restrictions.Where(ah=>ah.AdditionalDefaultWeek == null)))
            .List();

Я не очень хорошо разбираюсь в запросах, поэтому может быть лучше синтаксис

...