2017-10-16 86 views
0

如何將以下sql查詢轉換爲LINQ?如何將這段SQL轉換爲LINQ?

SELECT COUNT(*) FROM (SELECT SUM(bdi.Amount)-SUM(di.Debit -di.Credit) AS Remaining 
FROM Acc.DocItem di 
INNER JOIN (SELECT bdi.SLRef,bdi.DL,bdi.DL2,bdi.DL3,bdi.DL4,bdi.DL5,bdi.DL6,bdi.DL7,bdi.Amount,bhdr.StartDate,bhdr.EndDate FROM 
Budget.BudgetDocItem bdi INNER JOIN Budget.BudgetDocHeader bhdr ON bhdr.Id = bdi.BudgetDocHeaderRef) AS bdi 
ON 
(bdi.SLRef IS NULL AND di.SLRef IS NULL) OR bdi.SLRef = di.SLRef AND 
(bdi.DL IS NULL AND di.DL IS NULL) OR bdi.DL = di.DL AND 
(bdi.DL2 IS NULL AND di.DL2 IS NULL) OR bdi.DL2 = di.DL2 AND 
(bdi.DL3 IS NULL AND di.DL3 IS NULL) OR bdi.DL3 = di.DL3 AND 
(bdi.DL4 IS NULL AND di.DL4 IS NULL) OR bdi.DL4 = di.DL4 AND 
(bdi.DL5 IS NULL AND di.DL5 IS NULL) OR bdi.DL5 = di.DL5 AND 
(bdi.DL6 IS NULL AND di.DL6 IS NULL) OR bdi.DL6 = di.DL6 AND 
(bdi.DL7 IS NULL AND di.DL7 IS NULL) OR bdi.DL7 = di.DL7 

GROUP BY di.SLRef ,di.DL ,di.DL2 ,di.DL3 ,di.DL4 ,di.DL5 ,di.DL6 ,di.DL7,di.DocCreateDate,bdi.StartDate,bdi.EndDate,di.State 
HAVING di.State!=1 AND di.DocCreateDate BETWEEN bdi.StartDate AND bdi.EndDate 
) AS r 
WHERE r.Remaining<0 

當我想這一塊的SQL轉換爲LINQ(蒙山Linqer),我收到此錯誤:

SQL cannot be converted to LINQ: OR cannot be used in (SELECT bdi.SLRef,bdi.DL,bdi.DL2,bdi.DL3,bdi.DL4,bdi.DL5,bdi.DL6,bdi.DL7,bdi.Amount,bhdr.StartDate,bhdr.EndDate FROM Budget.BudgetDocItem bdi INNER JOIN Budget.BudgetDocHeader bhdr ON bhdr.Id = bdi.BudgetDocHeaderRef) AS bdi ON (bdi.SLRef IS NULL AND di.SLRef IS NULL) OR bdi.SLRef = di.SLRef AND (bdi.DL IS NULL AND di.DL IS NULL) OR bdi.DL = di.DL AND (bdi.DL2 IS NULL AND di.DL2 IS NULL) OR bdi.DL2 = di.DL2 AND (bdi.DL3 IS NULL AND di.DL3 IS NULL) OR bdi.DL3 = di.DL3 AND (bdi.DL4 IS NULL AND di.DL4 IS NULL) OR bdi.DL4 = di.DL4 AND (bdi.DL5 IS NULL AND di.DL5 IS NULL) OR bdi.DL5 = di.DL5 AND (bdi.DL6 IS NULL AND di.DL6 IS NULL) OR bdi.DL6 = di.DL6 AND (bdi.DL7 IS NULL AND di.DL7 IS NULL) OR bdi.DL7 = di.DL7 INNER JOIN

+2

如果你想要將SQL轉換爲Linq,請顯示您的linq嘗試。使用自動化工具,失敗,只是發佈一個問題並不是真的嘗試.. –

+2

而linq不支持連接中的'或'。以前有關於如何解決它的問題(我已經回答了一些問題) –

+0

是否絕對有必要讓Linq查詢成爲可能,因爲您也可以使用DbContext。 – Rob

回答

1

試試這個代碼:

from di in myContext.DocItems 
join bdi in (
    (from bdi0 in myContext.BudgetDocItems 
    join bhdr in myContext.BudgetDocHeaders on new { Id = bdi0.BudgetDocHeaderRef } equals new { Id = bhdr.Id } 
    select new { 
     bdi0.SLRef, 
     bdi0.DL, 
     bdi0.DL2, 
     bdi0.DL3, 
     bdi0.DL4, 
     bdi0.DL5, 
     bdi0.DL6, 
     bdi0.DL7, 
     bdi0.Amount, 
     bhdr.StartDate, 
     bhdr.EndDate 
    })) 
     on new { di.SLRef, di.DL, di.DL2, di.DL3, di.DL4, di.DL5, di.DL6, di.DL7 } 
    equals new { bdi.SLRef, bdi.DL, bdi.DL2, bdi.DL3, bdi.DL4, bdi.DL5, bdi.DL6, bdi.DL7 } 
group new {di, bdi} by new { 
    di.SLRef, 
    di.DL, 
    di.DL2, 
    di.DL3, 
    di.DL4, 
    di.DL5, 
    di.DL6, 
    di.DL7, 
    di.DocCreateDate, 
    bdi.StartDate, 
    bdi.EndDate, 
    di.State 
} into g 
select new { 
    Remaining = (double?)(g.Sum(p => p.bdi.Amount) - g.Sum(p => p.di.Debit - p.di.Credit)) 
} 
+0

請解釋爲什麼這可能會解決問題,而不僅僅是把代碼 –

+0

感謝您的建議,這段代碼在LINQ中是SQL等效的嗎? –

+1

不,原始SQL將加入如果列的所有都相等。 –