Я пытаюсь преобразовать следующий (упрощенный) HQL в QueryOver:
select subscription
from Subscription as subscription
where not exists (
from Shipment as shipment
where shipment.Subscription = subscription
and (shipment.DeliveryDate = :deliveryDate)
)
Я зашел так далеко:
Subscription subscription = null;
Session.QueryOver(() => subscription)
.Where(Subqueries.NotExists(QueryOver.Of<Shipment>()
.Where(shipment => shipment.Subscription == subscription)
.And(shipment=> shipment.DeliveryDate == deliveryDate)
.Select(shipment => shipment.Id).DetachedCriteria));
.TransformUsing(new DistinctRootEntityResultTransformer());
Проблема заключается в том, что выше *Оператор 1007 * и Where
дает мне следующее (недопустимое) условие where:
where shipment.SubscriptionId is null
когда то, что я хочу:
where shipment.SubscriptionId = subscription.Id
Таким образом, псевдоним и его значение на уровне строкине учитывается при построении SQL, вместо этого его начальное значение null
используется для сравнения с Shipment
SubscriptionId
.
Обновление
с помощью решения, предоставленного dotjoeЯ смог написать оператор QueryOver
следующим образом:
Subscription subscription = null;
Session.QueryOver(() => subscription)
.WithSubquery.WhereNotExists(QueryOver.Of<Shipment>()
.Where(shipment => shipment.Subscription.Id == subscription.Id)
.And(shipment => shipment.DeliveryDate == deliveryDate)
.Select(shipment => shipment.Id));