'Sum Over Partition By in Entity Framework subquery

I'm trying to convert a query to lambda, and I'm close to what I want, but I'm having trouble converting a subquery that includes a sum over partition by clause.

The original query is as follows:

DECLARE @mrn VARCHAR(6)

SET @mrn = 000000
SET TRANSACTION isolation level READ uncommitted

SELECT DISTINCT lablog.link                              AS MRN,
                lablog.cpk_lablog                        AS [Label Log #],
                lablog.orderno                           AS [Order #],
                lablog.scriptext                         AS [Rx #],
                parts.name_                              AS [Medication Name],
                parts.ndc,
                lablog.refillnum                         AS [Fill #],
                lablog.bagsdisp                          AS [Quantity],
                lablog.dayssupp                          AS [Days Supplied],
                lablog.rxdays                            AS [Therapy Days],
                LOTLOG.lot                               AS [Lot],
                LOTLOG.[lot quantity],
                LOTLOG.[lot expiration date],
                Cast(lablog.delivdate AS DATE)           AS
                [Delivery Promised Date],
                Cast(tickci.confdate AS DATE)            AS
                [Ticket Confirmed Date],
                Cast(lablog.nextcomp AS DATE)            AS
                [Next Anticipated Fill Date],
                lablog.inits                             AS
                [Dispensing Location],
                doctors.ph_first + ' ' + doctors.ph_last AS [Prescriber Name]
FROM   cprsql.dbo.lablog
       INNER JOIN cprsql.dbo.parts
               ON parts.no = lablog.invno
       LEFT OUTER JOIN cprsql.dbo.doctors
                    ON doctors.no = lablog.docno
       LEFT OUTER JOIN cprsql.dbo.tickc
                    ON tickc.mrn = lablog.link
                       AND tickc.lablogno = lablog.cpk_lablog
       LEFT OUTER JOIN cprsql.dbo.tickci
                    ON tickci.tickno = tickc.tickno
       LEFT OUTER JOIN (SELECT link                                 AS MRN,
                               lotlog.lablogno,
                               lotlog.lot                           AS [Lot],
                               Sum(lotlog.qty)
                                 OVER (
                                   partition BY lablogno, lot, exp) AS
                               [Lot Quantity],
                               Cast(lotlog.exp AS DATE)             AS
       [Lot Expiration Date]
                        FROM   cprsql.dbo.lotlog
                        WHERE  1 = 1
                               AND lotlog.link = @mrn
                               AND lotlog.delflag = 0)LOTLOG
                    ON LOTLOG.lablogno = lablog.cpk_lablog
WHERE  1 = 1
       AND lablog.link = @mrn
       AND lablog.filltype <> 0
ORDER  BY cpk_lablog DESC

My lambda expression thus far looks like this

var query = (from labLog in _context.LabLog
            join parts in _context.Parts on labLog.InvNo equals parts.Id
            join doctors in _context.Doctors on labLog.DocNo equals doctors.Id into Doctors
            from d in Doctors.DefaultIfEmpty()
            join tick in _context.TickC on new {MRN = labLog.Link, ID = (int?) labLog.Id} equals
                new {MRN = mrn, ID = tick.LabLogNo} into Tick
            from t in Tick.DefaultIfEmpty()
            join tickCI in _context.TickCi on t.TickNo equals tickCI.Id into TickCI
            from tci in TickCI.DefaultIfEmpty()
            join lotLog in
                from lLog in _context.LotLog
                where !lLog.Deleted && lLog.Link == mrn
                select new
                {
                    lLog.LabLogNo,
                    lLog.Lot,
                    LotQuantity = // This clearly is not correct
                        (from l in _context.LotLog
                            group l by new {l.LabLogNo, l.Lot, l.Exp}
                            into ll
                            select ll.Sum(lll => lll.Qty)),
                    LotExpirationDate = lLog.Exp
                } on labLog.Id equals lotLog.LabLogNo into LotLog
            from ll in LotLog.DefaultIfEmpty()
            where labLog.Link == mrn && labLog.FillType != 0
            select new PatientDispense
            {
                MRN = labLog.Link,
                LabelLogNumber = labLog.Id,
                OrderNumber = labLog.OrderNo,
                RxNumber = labLog.ScripText,
                MedicationName = parts.Name,
                NationDrugCode = parts.Ndc,
                FillNumber = labLog.RefillNum,
                Quantity = int.TryParse(labLog.BagsDisp, out temp) ? temp : 0,
                DaysSupplied = int.TryParse(labLog.DaysSupp, out temp) ? temp : 0,
                TherapyDays = int.TryParse(labLog.RxDays, out temp) ? temp : 0,
                Lot = ll.Lot,
                LotQuantity = Convert.ToInt32(ll.LotQuantity),
                LotExpirationDate = ll.LotExpirationDate,
                DeliveryPromisedDate = labLog.DelivDate,
                TicketConfirmedDate = tci.ConfDate,
                NextAnticipatedFillDate = labLog.NextComp,
                DispensingLocation = labLog.Inits,
                PrescriberName = $"{d.PhFirst} {d.PhLast}"
            }).Distinct();

Which outputs the following query

DECLARE @__mrn_0 VARCHAR(6) = '000000';

SELECT DISTINCT [c].[link],
                [c].[cpk_lablog],
                [c].[orderno],
                [c].[scriptext],
                [c0].[name_],
                [c0].[ndc],
                [c].[refillnum],
                [c].[bagsdisp],
                [c].[dayssupp],
                [c].[rxdays],
                [t].[lot],
                (SELECT TOP(1) COALESCE(Sum([c5].[qty]), 0.0)
                 FROM   [cpr_lotlog] AS [c5]
                 GROUP  BY [c5].[lablogno],
                           [c5].[lot],
                           [c5].[exp]),
                [t].[exp],
                [c].[delivdate],
                [c3].[confdate],
                [c].[nextcomp],
                [c].[inits],
                [c1].[ph_first],
                [c1].[ph_last]
FROM   [cpr_lablog] AS [c]
       INNER JOIN [cpr_parts] AS [c0]
               ON [c].[invno] = [c0].[no]
       LEFT JOIN [cpr_doctors] AS [c1]
              ON [c].[docno] = [c1].[no]
       LEFT JOIN [cpr_tickc] AS [c2]
              ON ( [c].[link] = @__mrn_0 )
                 AND ( [c].[cpk_lablog] = [c2].[lablogno] )
       LEFT JOIN [cpr_tickci] AS [c3]
              ON [c2].[tickno] = [c3].[tickno]
       LEFT JOIN (SELECT [c4].[exp],
                         [c4].[lablogno],
                         [c4].[lot]
                  FROM   [cpr_lotlog] AS [c4]
                  WHERE  ( [c4].[deleted] = Cast(0 AS BIT) )
                         AND ( [c4].[link] = @__mrn_0 )) AS [t]
              ON [c].[cpk_lablog] = [t].[lablogno]
WHERE  ( [c].[link] = @__mrn_0 )
       AND ( ( [c].[filltype] <> 0 )
              OR ( [c].[filltype] IS NULL ) ) 


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source