如何根据匹配记录的数量包含nHibernate Criterion

时间:2011-11-10 23:57:47

标签: nhibernate nhibernate-criteria

背景

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

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

换句话说,返回仅包含大小为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)))

必须有更好的方法。像“where count(DISTINCT SIZES)= 1”

之类的东西

但我不确定如何在nHibernate中实现它。

建议?

1 个答案:

答案 0 :(得分:1)

正如dotjoe建议的那样,我相信having子句是通过在一个临时变量中存储一个投影,然后在投影列表和限制列表中使用它来完成的,尽管我只用{{1 }}查询,而不是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); 查询,但我不想破坏你的乐趣。这足以让你指向正确的方向吗?