2015-08-27 48 views
3

我試圖將我的T-SQL轉換爲LINQ。這給了我一個真正的頭痛。任何人都可以指出我在做什麼錯在這裏:使用實體框架將T-SQL轉換爲LINQ

T-SQL 
select 
    h.DateStamp 
, h.Machine 
, h.SalesInvoice 
, h.Status 
, sum(i.Quantity)           totalquantity 
, sum(IIF(h.[Status]='SALES', i.Quantity, 0))    as SalesQty 
, sum(IIF(h.[Status]='RETURNS', i.Quantity, 0))    as ReturnQty 
, sum(IIF(h.[Status]='SALES', i.Quantity*i.Soldsrp , 0)) as SalesGross 
, sum(IIF(h.[Status]='RETURNS', i.Quantity*i.Soldsrp, 0)) as ReturnGross 
, sum(IIF(h.[Status]='SALES', i.DiscountAmount , 0))  as SalesDiscount 
, sum(IIF(h.[Status]='RETURNS', i.DiscountAmount, 0))  as ReturnDiscount 
, sum(IIF(h.[Status]='SALES', i.TotalAmount , 0))   as SalesACD 
, sum(IIF(h.[Status]='RETURNS', i.TotalAmount , 0))   as ReturnACD 

from CSHR_SalesItems i 
left join CSHR_SalesHeader h on h.SalesOrderNum = i.SalesOrderNum 
where H.DateStamp between '2015-08-20 00:00:00.000' and '2015-08-27 23:59:00.000' 

group by h.DateStamp, h.Machine, h.SalesInvoice, h.[Status] 

這裏是我試圖把它變成LINQ與實體框架。 GroundCommander是實體

using (var GC = new GroundCommanderEntities()) 
{ 
    foreach (var item in GC.CSHR_SalesItems) 
    { 
     var Summary = 
      from i in GC.CSHR_SalesItems 
      join h in GC.CSHR_SalesHeader on item.SalesOrderNum equals h.SalesOrderNum into IH 
      from h in IH 
      where (h.DateStamp >= dateTimePickerStart.Value && h.DateStamp <= dateTimePickerLast.Value)     
      select new { 
       h.DateStamp, 
       h.Machine, 
       h.SalesInvoice, 
       h.Status, 
       i.Quantity //need to get the sum 
      }; 
    } 
+0

您需要'從IH.DefaultIfEmpty()'中的h使它成爲左連接。 – juharr

+0

謝謝,我沒注意到。 –

+0

雖然我不認爲你需要一個左連接,因爲當左邊爲空時,哪裏會是假的。 – juharr

回答

1

我相信這是你想要的。

var Summary = 
    from i in GC.CSHR_SalesItems 
    join h in GC.CSHR_SalesHeader on item.SalesOrderNum equals h.SalesOrderNum 
    where (h.DateStamp >= dateTimePickerStart.Value 
      && h.DateStamp <= dateTimePickerLast.Value)  
    group new { item = i, header = h} 
     by new {h.DateStamp, h.Machine, h.SalesInvoice, h.Status} into grp 
    select new { 
     grp.Key.DateStamp, 
     grp.Key.Machine, 
     grp.Key.SalesInvoice, 
     grp.Key.Status, 
     TotalQuanity = grp.Sum(x => x.item.Quantity), 
     SalesQty = grp.Where(x => x.header.Status == "SALES").Sum(x => x.item.Quantity), 
     ... 
    }; 

我第一次擺脫了左邊的加入,因爲任何時候,右側是null這哪裏會是假的呢。其次,我添加了將創建適當分組的組。然後在選擇你可以做總和的總和,我已經給你一個如何根據其他總計狀態過濾的例子。

+0

我很好奇爲什麼會爲此生成SQL,以及它是否像手寫代碼一樣高效。 – Dai

+0

您可以使用SQL Server Profiler查看創建的內容。通常EF SQL很難閱讀。您可以在SSMS中運行這兩者來查看執行計劃是否有所不同。 – juharr

+0

我正在嘗試它。目前閱讀代碼看起來是正確的。感謝迄今 –