Core EF Outer Join, Count & Group - PullRequest
       31

Core EF Outer Join, Count & Group

0 голосов
/ 24 мая 2019

Я пытаюсь преобразовать этот SQL-запрос в Core EF:

SELECT w.IdShippingBatch, w.BookingNumber, COUNT(c.IdShippingOrder) AS ShippingOrders, w.CreatedOn, w.ModifiedOn
    FROM dbo.Shipping`enter code here`Batch AS w LEFT OUTER JOIN
            dbo.ShippingOrders AS c ON w.IdShippingBatch = c.IdShippingBatch
    WHERE (w.IdCompany = 2) AND (w.IdDealer = 1)
    GROUP BY w.IdShippingBatch, w.BookingNumber, w.CreatedOn, w.ModifiedOn

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

var data = (from w in _context.ShippingBatch
    join c in _context.ShippingOrders on w.IdShippingBatch equals c.IdShippingBatch into t1
    where w.IdCompany == idCompany && w.IdDealer == idDealer
    from t2 in t1.DefaultIfEmpty()
    group t2 by new { w.IdShippingBatch, w.BookingNumber, w.CreatedOn, w.ModifiedOn } into t3
    select new ShippingBatchDTO
    {
        IdShippingBatch = t3.Key.IdShippingBatch,
        BookingNumber = t3.Key.BookingNumber,
        ShippingOrders = t3.Count(),
        CreatedOn = t3.Key.CreatedOn,
        ModifiedOn = t3.Key.ModifiedOn
    });

Я также пытался добавить t3.count (m => m.something! = Null), но это выдает ошибку.

Спасибо запомощь.

1 Ответ

1 голос
/ 24 мая 2019

Одной из основных целей EF является сопоставление отношений между сущностями, чтобы вы могли использовать LINQ и позволить EF составлять SQL-запрос, а не пытаться заменить SQL на LINQ-QL.

Если ваш ShippingBatch сопоставленс коллекцией ShippingOrders ...

var batches = _context.ShippingBatch
  .Where(x => x.IdCompany == idCompany && x.IdDealer == idDealer)
  .Select(x => new ShippingBatchDTO
  {
        IdShippingBatch = x.IdShippingBatch,
        BookingNumber = x.BookingNumber,
        ShippingOrders = x.ShippingOrders.Count(),
        CreatedOn = x.CreatedOn,
        ModifiedOn = x.ModifiedOn    
  }).ToList();

Если ваш ShippingBatch не имеет коллекции ShippingOrders, но ваш ShippingOrder ссылается на необязательный ShippingBatch.

var batches = _context.ShippingOrder
  .Where(x => x.ShippingBatch != null 
    && x.ShippingBatch.IdCompany == idCompany 
    && x.ShippingBatch.IdDealer == idDealer)
  .GroupBy(x => x.ShippingBatch)
  .Select(x => new ShippingBatchDTO
  {
        IdShippingBatch = x.Key.IdShippingBatch,
        BookingNumber = x.Key.BookingNumber,
        ShippingOrders = x.Count(),
        CreatedOn = x.Key.CreatedOn,
        ModifiedOn = x.Key.ModifiedOn    
  }).ToList();

Это, мы надеемся, получит васдвигаясь в правильном направлении.Если нет, расширьте свой вопрос, включив в него подробную информацию о том, что вы видите, и что вы ожидаете увидеть вместе с определениями для соответствующих субъектов.

...