Я искал свой конкретный вопрос и нашел несколько близких вопросов, но ни один не помог после долгих экспериментов.
Учитывая следующий код:
var results = context.Shipments.AsNoTracking().Where(x => customerIds.Contains(x.CustomerId.Value) && x.ProcessStageFlag == ProcessStage.Complete)
.GroupJoin(context.Audit.AsNoTracking().Where(x => x.Action != null),
sh => new { im.Shipments.TrackingNumber, im.Shipments.InvoiceNumber },
au => new { rn.TrackingNumber, rn.InvoiceNumber },
(sh, au) => new { Shipments = sh.Shipments, Audit = au })
.SelectMany(x => x.Audit.DefaultIfEmpty(),
(x, y) => new { Shipments = x.Shipments, Audit = y })
.Select(...)
.ToList()
.GroupBy(x => new {x.TrackingNumber, x.InvoiceNumber})
.Select(z => z.FirstOrDefault())
.ToList();
Кажется, я не могу получить последнюю запись, которую я взял в Audit.
Я попытался добавить .OrderByDescending(x => x.LastUpdatedOn)
к .GroupJoin
, а также .SelectMany
без изменений.
Это запрос, который я пытаюсь воспроизвести в LINQ:
SELECT ship.Invoice_Number, au.Notes, au2.date_added
FROM shipments ship
LEFT OUTER JOIN audit au ON ship.Invoice_Number = au.invoice_number AND au.is_manual_note = 1
LEFT OUTER JOIN audit au2 ON ship.Invoice_Number = au2.invoice_number AND ra2.notes = 'Auto Created' AND au2.date_added = (SELECT MAX(date_added) FROM audit WHERE Invoice_Number = ship.invoice_number AND notes = 'Auto Created')
Таблица аудита должна быть объединена дважды: один раз, чтобы извлечь введенные вручную заметки, и один раз, чтобы определить, когда был создан аудит. Запрос date_added необходим, поскольку поставки могут входить и выходить из аудита несколько раз.
Sammer