2017-06-27 108 views
-1

我想在LINQ中這樣做。 你們能幫我做這個嗎? 有一些工具可以幫助我進行此轉換嗎?SQL到Linq與聚合函數

SELECT 
CODIGO_DEPENDENCIA, 
SUM(COALESCE(LOCAL_MOVEL, 0))   AS LOCAL_MOVEL, 
SUM(COALESCE(LOCAL_FIXO, 0))   AS LOCAL_FIXO, 
SUM(COALESCE(DDD_MOVEL, 0))    AS DDD_MOVEL, 
SUM(COALESCE(DDD_FIXO, 0))    AS DDD_FIXO, 
SUM(COALESCE(EXTERNA_INTERNACIONAL, 0)) AS EXTERNA_INTERNACIONAL 
FROM (
SELECT 
CODIGO_DEPENDENCIA, 
CASE WHEN TIPO = 'SELM' THEN SUM(VALOR) END AS LOCAL_MOVEL, 
CASE WHEN TIPO = 'SELF' THEN SUM(VALOR) END AS LOCAL_FIXO, 
CASE WHEN TIPO = 'SENM' THEN SUM(VALOR) END AS DDD_MOVEL, 
CASE WHEN TIPO = 'SENF' THEN SUM(VALOR) END AS DDD_FIXO, 
CASE WHEN TIPO = 'SEI' THEN SUM(VALOR) END AS EXTERNA_INTERNACIONAL 
FROM CAD_BILHETES 
WHERE ID_PRODUTO IS NULL 
AND ID_COMPETENCIA = 60 
AND CODIGO_DEPENDENCIA IN (14, 160) 
AND TIPO IN ('SEI', 'SELM', 'SENF', 'SELF', 'SENM') 
AND VALOR <> 0 
GROUP BY TIPO,CODIGO_DEPENDENCIA 
) TAB 
GROUP BY CODIGO_DEPENDENCIA 
+0

它應該是可能的 - LINQ本身是相當強大的。你現在的進度是什麼樣子? – Scott

+0

嘗試包含您嘗試過的一些代碼,並描述您的失敗位置。這就是說,[linq墊可能是有用的](http://www.linqpad.net/)給你。 – Fabulous

+0

我試圖將這段代碼轉換爲SQL到LINQ。 我的進度小於0 – user2570306

回答

0

顯然未經測試。此外,不確定是否需要null測試或者他們將如何通過SQL轉換作出反應。最好將第一個查詢更改爲不匹配時返回0,然後對結果進行求和,但我不確定列的數據類型。

var tab = from cb in CAD_BILHETES 
     where cb.ID_PRODUTO == null && cb.ID_COMPETENCIA == 60 && (new[] { 14, 160 }).Contains(cb.CODIGO_DEPENDENCIA) && 
     (new[] { "SEI", "SELM", "SENF", "SELF", "SENM" }).Contains(cb.TIPO) && cb.VALOR != 0 
     group cb by new { cb.TIPO, cb.CODIGO_DEPENDENCIA } into cbg 
     select new { cbg.Key.CODIGO_DEPENDENCIA, 
      LOCAL_MOVEL = (cbg.Key.TIPO == "SELM" ? cbg.SUM(cb => cb.VALOR) : null), 
      LOCAL_FIXO = (cbg.Key.TIPO == "SELF" ? cbg.SUM(cb => cb.VALOR) : null), 
      DDD_MOVEL = (cbg.Key.TIPO == "SENM" ? cbg.SUM(cb => cb.VALOR) : null), 
      DDD_FIXO = (cbg.Key.TIPO == "SENF" ? cbg.SUM(cb => cb.VALOR) : null), 
      EXTERNA_INTERNACIONAL = (cbg.Key.TIPO == "SEI" ? cbg.SUM(cb => cb.VALOR) : null), 
     }; 

var ans = from cb in tab 
     group cb by cb.CODIGO_DEPENDENCIA into cbg 
     select new { 
     CODIGO_DEPENDENCIA = cbg.Key, 
      LOCAL_MOVEL = cbg.Sum(cb => cb.LOCAL_MOVEL == null ? 0 : cb.LOCAL_MOVEL), 
      LOCAL_FIXO = cbg.Sum(cb => cb.LOCAL_FIXO == null ? 0 : cb.LOCAL_FIXO), 
      DDD_MOVEL = cbg.Sum(cb => cb.DDD_MOVEL == null ? 0 : cb.DDD_MOVEL), 
      DDD_FIXO = cbg.Sum(cb => cb.DDD_FIXO == null ? 0 : cb.DDD_FIXO), 
      EXTERNA_INTERNACIONAL = cbg.Sum(cb => cb.EXTERNA_INTERNACIONAL == null ? 0 : cb.EXTERNA_INTERNACIONAL) 
     }; 
+0

非常感謝你,你只是解決了我的問題。 – user2570306