Entity Framework Создать левое внешнее объединение, которое извлекает только последнюю запись - PullRequest
1 голос
/ 16 января 2020

Я искал свой конкретный вопрос и нашел несколько близких вопросов, но ни один не помог после долгих экспериментов.

Учитывая следующий код:

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

...