0

背景:

  • 我有 Master 和 Detail 表,M 和 D;
  • M 包含订单,D 包含各种尺寸(S、M、L、XL)零件的订单详情
  • 给定的订单可能包含任意数量的部分。
  • 95% 的订单至少包含一件尺寸为 S 的商品
  • 新要求是将来可以添加尺寸,因此对 SMLXL 列表进行硬编码不再有效

我正在寻找一个 nHibernate 查询,它返回所有订单 M 的列表,其中仅包含特定大小的部分。

换句话说,返回所有仅包含部分尺寸 S 的订单,并排除所有包含混合尺寸的订单。

我正在使用:

matching_orders.Add(
 Expression.Conjunction()
 .Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).In(DetailQueryOver(S)))
 .Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).NotIn(DetailQueryOver(M)))
 .Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).NotIn(DetailQueryOver(L)))
 .Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).NotIn(DetailQueryOver(XL)))

肯定有更好的办法。类似“其中 count(DISTINCT SIZES) = 1”的东西

但我不确定如何在 nHibernate 中实现这一点。

建议?

4

1 回答 1

1

正如 dotjoe 建议的那样,我相信having子句是通过将投影存储在临时变量中,然后在投影列表和限制列表中使用它来完成的,尽管我只使用ICriteria查询而不是QueryOver.

编写此查询的另一种方法是使用两个子查询 - 一个表示您要查找的大小,另一个表示所有其他大小。就像是...

select *
from Orders o
where
    exists (
        select d1.Id
        from OrderDetail d1
        where
            d1.Order_id = o.Id
            and d1.Size = @size)
    and not exists (
        select d2.Id
        from OrderDetail d2
        where
            d2.Order_id = o.Id
            and d2.Size <> @size);

我们可以将这个答案更进一步,并将其转换为QueryOver查询,但我不想破坏你的乐趣。这足以让你指出正确的方向吗?

于 2011-11-11T03:45:37.607 回答