2011-07-21 57 views
0

带有Restrictions.Discjunction()或Restrictions.Or()的投影将产生WHERE子句而不是HAVING子句。这将导致错误(WHERE子句不能引用聚合表达式)。带限制的投影。交换接口

例子:

.CreateCriteria(typeof(SalesOrderLine), "SOL") 
.CreateCriteria("DeliveryOrderLines", "DOL", JoinType.LeftOuterJoin) 
.SetProjection(
    Projections.GroupProperty("SOL.Key").As("SalesOrderLineId"), 
    Projections.GroupProperty("SOL.Item"), 
    Projections.GroupProperty("SOL.Description"), 
    Projections.GroupProperty("SOL.UnitPrice"), 
    Projections.GroupProperty("SOL.Quantity"), 
    Projections.GroupProperty("SOL.DiscountPercentage"), 
    Projections.GroupProperty("SOL.SalesOrder")) 
.Add(Restrictions.Or(
    Restrictions.IsNull(Projections.Sum("DOL.Quantity")), 
    Restrictions.GtProperty("SOL.Quantity", Projections.Sum("DOL.Quantity")))), 
.List(); 

SQL结果:

SELECT this_.SalesOrderLineId as y0_, this_.Item as y1_, this_.Description as y2_, this_.UnitPrice as y3_, this_.Quantity as y4_, this_.DiscountPercentage as y5_, this_.SalesOrderId as y6_ FROM SalesOrderLine this_ left outer join DeliveryOrderLine dol1_ on this_.SalesOrderLineId=dol1_.SalesOrderLineId 
WHERE (sum(dol1_.Quantity) is null or this_.Quantity > sum(dol1_.Quantity)) 
GROUP BY this_.SalesOrderLineId, this_.Item, this_.Description, this_.UnitPrice, this_.Quantity, this_.DiscountPercentage, this_.SalesOrderId 

难道我做错了?或者这是Nhibernate 3.1中的一个错误?

在此先感谢:)。

回答

1

上次我检查了HAVING子句不被Criteria API支持。您需要使用支持HAVING的HQL。

要使用标准的API使用,你就必须修改您的查询到这一点:

SELECT this_.SalesOrderLineId as y0_, this_.Item as y1_, this_.Description as y2_, this_.UnitPrice as y3_, this_.Quantity as y4_, this_.DiscountPercentage as y5_, this_.SalesOrderId as y6_ FROM SalesOrderLine this_ left outer join DeliveryOrderLine dol1_ on this_.SalesOrderLineId=dol1_.SalesOrderLineId 
WHERE (select sum(Quantity) from DeliveryOrderLine) is null or (select sum(Quantity) from > SalesOrderLine) > (select sum(Quantity) from DeliveryOrderLine) 
GROUP BY this_.SalesOrderLineId, this_.Item, this_.Description, this_.UnitPrice, this_.Quantity, this_.DiscountPercentage, this_.SalesOrderId 

,我已经给会因为多次和计算的一些性能问题的解决方案,但它会得到工作完成。

你也可以试试这个,但我不知道这是否会正常运行:

SELECT this_.SalesOrderLineId as y0_, this_.Item as y1_, this_.Description as y2_, this_.UnitPrice as y3_, this_.Quantity as y4_, this_.DiscountPercentage as y5_, this_.SalesOrderId as y6_, SUM(dol1_Quantity) as sum1, SUM(this_.Quantity) as sum2 from SalesOrderLine this_ left outer join DeliveryOrderLine dol1_ on this_.SalesOrderLineId=dol1_.SalesOrderLineId 
WHERE sum1 is null or sum1 > sum2 
GROUP BY this_.SalesOrderLineId, this_.Item, this_.Description, this_.UnitPrice, this_.Quantity, this_.DiscountPercentage, this_.SalesOrderId 

希望这有助于!

+0

谢谢varun! 性能在这里很重要,所以我不能使用你的第一个标准API解决方案。 你能指导我解决你的第二个问题吗? 我尝试给我的预测别名,但我不能用它的限制。 –