我有两个表 InvoiceInvoiceLineItem 。此 InvoiceLineItem 表包含:

Id
InvoiceId
Quantity
UnitPrice

列。我想创建 NHibernate QueryOver 语句来按 InvoiceId 对发票行项目进行分组,并获得 UnitPriceQuantity 的乘积之和

SQL是这样的。

SELECT InvoiceId, SUM(Quantity*UnitPrice) AS Total
  FROM InvoiceLineItem
GROUP BY InvoiceId

我使用了 Projections.Sum 但我不确定如何将其中的两列相乘(如果这是正确的方法)。

最佳答案

看起来没有什么好方法可以做到这一点。基于 this answer 构建,您可以使用 VarArgsSQLFunction :

InvoiceLineItem lineItemAlias = null;

session.QueryOver<InvoiceLineItem>(() => lineItemAlias)
    .SelectList(list => list
        .Select(Projections.Sum(
            Projections.SqlFunction(new VarArgsSQLFunction("(", "*", ")"),
            NHibernateUtil.Double,
            Projections.Property(() => lineItemAlias.Quantity),
            Projections.Property(() => lineItemAlias.UnitPrice))))
        .SelectGroup(() => lineItemAlias.Invoice.Id)
   // TransformUsing, List<>, etc.

这将生成如下所示的 SQL:

SELECT
    sum((this_.Quantity*this_.UnitPrice)) as y0_,
    this_.InvoiceId as y1_
FROM
    InvoiceLineItem this_
GROUP BY
    this_.InvoiceId

10-06 07:53