将聚合SQL查询转换为LINQ

时间:2012-12-08 18:12:33

标签: c# linq entity-framework-5

我决定尝试LINQ,到目前为止,这是一个悲惨的失败。我需要将以下SQL查询转换为LINQ:

SELECT 
MAX(A.NEXTPAYMENTDATE) as NextPaymentDate
, SUM(B.PurchasePrice) - SUM(A.Amount) AS BALANCE
, c.FirstName
, c.LastName
, b.[year]
, b.make
, b.model
FROM Payments A
JOIN Vehicles B ON A.VehicleId = B.Id
JOIN Customers C ON  b.CustomerId = c.Id
GROUP BY VehicleId, c.FirstName, c.LastName, b.[year], b.make, b.model
HAVING SUM(B.PurchasePrice) - SUM(A.Amount) > 0

这是我到目前为止所拥有的。它似乎在一定程度上起作用,但我不知道如何从这里开始。

var groupedpayments = 
    from payments in db.Payments
    group payments by new { payments.VehicleId }
    into paymentGroup
        let maxDate = paymentGroup.Max(x => x.NextPaymentDate)
        let paid = paymentGroup.Sum(x => x.Amount)
    select 
    new { Payments = paymentGroup.Where(x => x.NextPaymentDate == maxDate)};

1 个答案:

答案 0 :(得分:2)

我认为这就是你所需要的。

var query =
    Payments.Join(Vehicles, p => p.VehicleId, v => v.Id, (p, v) => new {p, v})
        .Join(Customers, d => d.v.CustomerId, c => c.Id, (d, c) => new {d, c})
        .GroupBy(r => 
                   new {
                           r.d.p.VehicleId,
                           r.d.v.year,
                           r.d.v.make,
                           r.d.v.model,
                           r.c.FirstName,
                           r.c.LastName
                       },
                 (g, data) =>
                   new {
                           FirstName = g.FirstName,
                           LastName = g.LastName,
                           Year = g.year,
                           Make = g.make,
                           Model = g.model,
                           NextPaymentDate = data.Max(dd => dd.d.p.NEXTPAYMENTDATE),
                           Balance = data.Sum(dd => dd.d.v.PurchasePrice)
                                      - data.Sum(dd => dd.d.p.Amount)})
         .Where(r => r.Balance > 0);