2014-02-13 7 views
0

Я работаю над этим некоторое время, поэтому я думал, что разместил здесь, чтобы узнать, может ли кто-нибудь понять, как такой запрос, как следующий, может быть преобразован в LINQ.LINQ Query with join, group by and Sum()

Вот MySQL Query:

SELECT SUM(line_ord.itemqty) AS LineOrderQTY, SUM(assemblyNumber.qty) AS 
AssemblyQTY FROM line_ord 
LEFT JOIN 
(
    SELECT sum(assemblyno.qty) AS qty, assemblyno.row_id FROM assemblyno 
    INNER JOIN line_ord ON assemblyno.row_id = line_ord.row_id 
    WHERE line_ord.bdnum = 'S61460' 
) AS assemblyNumber ON line_ord.row_id = assemblyNumber.row_id 
WHERE line_ord.bdnum = 'S61460' 

Это то, что я до сих пор для запроса LINQ, но он не возвращает правильные результаты.

var items = (from c in Context.OrderLineItemData 
     join e in Context.AssemblyLabelData on c.ID equals e.RowID 
        where c.BreakdownNumber == breakdownNumber 

        group c by c.BreakdownNumber into g 
        select new 
        {        
          AssemblyQuantity= g.Sum(x => x.Quantity), 
          LineOrdQuantity = g.Sum(**WHAT GOES HERE?**) 
        }).FirstOrDefault() 

Мне удалось заставить его работать таким образом, но для меня это кажется грязным.

  var items = (from c in Context.OrderLineItemData 
        join e in Context.AssemblyLabelData on c.ID equals e.RowID 
        where c.BreakdownNumber == breakdownNumber 

        group c by c into g 
        select new 
        {        
          AssemblyQuantity= g.Sum(x => x.Quantity), 
          LineOrdQuantity = (from e in Context.OrderLineItemData where e.BreakdownNumber == breakdownNumber select e.Quantity).Sum() 
        }).FirstOrDefault(); 

Есть ли лучший способ сделать это?

ответ

0

Получил ответ. Кажется, что объект запроса должен быть создан, а затем я могу использовать его для предварительной обработки моих вычислений.

var items = (from od in Context.OrderLineItemData 
      join ad in Context.AssemblyLabelData on od.ID equals ad.RowID into odGroup 
      from g in odGroup.DefaultIfEmpty() 
      where od.BreakdownNumber == breakdownNumber 
      group g by new 
      { 
        breakdown = od.BreakdownNumber, 
        LineOrd = od, 
        AssemblyQty = g == null ? 0 : g.Quantity 
      } 
      into groupped 
      select new 
      { 
        Breakdown = groupped.Key.breakdown, 
        AssemblyQty = groupped.Sum(x => x.Quantity), 
        lineOrdQty = groupped.Key.LineOrd.Quantity 
      } 
     );    
     int remainingQuantity = items.Sum(x => x.lineOrdQty) - items.Sum(x => x.AssemblyQty);