简体   繁体   中英

nHibernate - Adding aggregate functions in .select

I am trying to implement a business formula in QueryOver.

POorder.Estimate is a calculated field and I need to get

ToDateOrderAmount = POrder.Estimate - Sum(PODist.Field1) - Sum(PODisTaxRebate.Field1 + PODisTaxRebate.Field2)

So I need to write a query. What I have now is:

    var reportModels =
        Session.QueryOver<Domain.Model.Purchasing.Vendor>(() => v)
            .Left.JoinQueryOver(() => v.Invoices, () => invoice)
            .Left.JoinQueryOver(() => invoice.PurchaseOrder, () => poOrder)
            .Left.JoinQueryOver(() => poOrder.PurchaseOrderDistributions, () => poDistribution)
            .Left.JoinQueryOver(() => poDistribution.TaxRebate, () => poTaxRebate)
            .SelectList(
                list =>
                list.Select(() => v.Number).WithAlias(() => varptModel.VendorNumber)
                    .Select(() => v.TypeCode.Code).WithAlias(() => varptModel.VendorType)
                    .Select(() => v.Name).WithAlias(() => varptModel.VendorName)
                    .Select(() => v.PurchasingContactPhoneNumber + "-Ext." + v.PurchasingContactPhoneNumberExt).WithAlias(() => varptModel.Phone)
                    .Select(() => v.Address).WithAlias(() => varptModel.Address)
                    .Select(() => invFiscalYear.Year).WithAlias(() => varptModel.Year)
                    .Select(() => invoice.TotalAmount).WithAlias(() => varptModel.InvoiceToDate)
                    .Select(() => invoice.AmountPaidToDate).WithAlias(() => varptModel.PaymentToDate)
                    .Select(() => poOrder.Estimate).WithAlias(() => varptModel.OrdersToDate)
        .Select(() => poOrder.Estimate - Sum(poDistribution.Field1) - Sum(poTaxRebate.Discount1 + poTaxRebate.Discount2) )
                    ).List();

But this is not right. What should I change it to?

I tried many things and found this working

.Select(Projections.SqlFunction(new VarArgsSQLFunction("", "+", ""),
                                NHibernateUtil.Double,
                                Projections.SqlFunction(new VarArgsSQLFunction("", "+", ""),
                                NHibernateUtil.Double,
                                Projections.Sum(Projections.SqlFunction("coalesce", NHibernateUtil.Double, Projections.Property(() => invoiceLineItem.Expense), Projections.Constant(0))),
                                Projections.Sum(Projections.SqlFunction("coalesce", NHibernateUtil.Double, Projections.Property(() => invitemTaxRebate.Rebate1Expense), Projections.Constant(0)))),
                                Projections.Sum(Projections.SqlFunction("coalesce", NHibernateUtil.Double, Projections.Property(() => invitemTaxRebate.Rebate2Expense), Projections.Constant(0)))))
                                .WithAlias(() => varptModel.ToDateInvoices)

which gave me this in SQL

sum(coalesce(invoicelin8_.Expense, 0 )) + sum(coalesce(invitemtax9_.Rebate1Expense, 0 )) + sum(coalesce(invitemtax9_.Rebate2Expense, 0 )) 

I added Coalesce as when we add or subtract values with null value, all values becomes null in result. Just a hint for new ones.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM