背景
我正在寻找一个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中实现它。
建议?
答案 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);
查询,但我不想破坏你的乐趣。这足以让你指向正确的方向吗?