【问题标题】:NHibernate QueryOver with sub-query and alias带有子查询和别名的 NHibernate QueryOver
【发布时间】:2011-12-06 05:55:18
【问题描述】:

我正在努力将以下(简化的)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());

问题是上面的SubqueriesWhere 语句给了我以下(无效的)where 子句:

where shipment.SubscriptionId is null

当我想要的是:

where shipment.SubscriptionId = subscription.Id

因此在构造 SQL 时不考虑别名及其行级值,而是使用其初始值nullShipmentSubscriptionId 进行比较。

更新

使用 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));

【问题讨论】:

    标签: c# nhibernate hql subquery queryover


    【解决方案1】:

    试试

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

    【讨论】:

    • 我猜你不能使用别名变量进行隐式 Id 比较。我认为只有在使用实际(加载的)订阅对象时才能这样做。
    • 我明白了。考虑到在 NHibernate 中通常如何进行 ID 比较,这有点不直观,但只要它有效,我就很高兴。谢谢! :) 我已经更新了关于在生成的 SQL 中缺少 distinct 关键字的问题,您知道它为什么会丢失吗?
    • distinctrootentitytransformer 与 SQL select distinct 不同。当您将集合加入查询并希望确保不会返回重复的根实体时,该转换器就在那里。它在客户端完成所有工作。
    • 那么如果我想在生成的 SQL 中添加一个distinct,我应该怎么做?
    • 我不确定你是否可以在新罕布什尔州做一个select distinct。由于您在 Subscription 表中有一个主键,这将使distinct 毫无意义。您可以通过使用 group by...SelectList + SelectGroup 进行投影来获得等效的 distinct
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多