NHibernate QueryOver с подзапросом и псевдонимом - PullRequest
4 голосов
/ 12 октября 2011

Я пытаюсь преобразовать следующий (упрощенный) 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));

1 Ответ

4 голосов
/ 12 октября 2011

1001 * попробовать *

.Where(shipment => shipment.Subscription.Id == subscription.Id)
...