2011-03-07 36 views
1

任何人都可以通過將此SQL語句轉換爲Linq來幫助我嗎?組連接多個錶轉換SQL到Linq

SELECT a.KPI, a.ProcessDate, a.Actual, lf.LPLocal, pf.LPProd, d.LocalDelta, d.ProdDelta 
FROM 
    Actual AS a 
    LEFT OUTER JOIN Local l ON l.Date = a.Date 
    LEFT OUTER JOIN Prod p ON p.Date = a.Date 
    LEFT OUTER JOIN Delta d ON d.Date = a.Date 

我做了一些研究,並與此想出了:

Dim Xq1 = (From a In tmpActual _ 
Group Join l In tmpLocal On l.Item("Dates") Equals a.Item("Dates") Into al = Group _ 
From x In al.DefaultIfEmpty() _ 
Group Join p In tmpProd On p.Item("Dates") Equals a.Item("Dates") Into ap = Group _ 
     From y In ap.DefaultIfEmpty() _ 
Group Join d In tmpDelta On d.Item("Dates") Equals a.Item("Dates") Into ad = Group _ 
From z In ad.DefaultIfEmpty() _ 
Select 
    KPI = a.Item("KPI"), ProcessDate = a.Item("Dates"), 
    AccountingActual = a.Item("AccountingActual"), 
    LocalForecast = x.Item("LocalForecast"), 
    ProdForecast = y.Item("ProdForecast"), 
    Localdelta = z.Item("LocalDelta"), 
    ProdDelta = z.Item("ProdDelta")).DefaultIfEmpty 

但是,當我跑了它,它有:

System.InvalidCastException被抓獲 消息=「無法類型 'd__9e 1[VB$AnonymousType_6 7 [System.Object,System.Object,System.Object,System.Object,System.Object,System.Object,System.Object]]' 類型'Syste m.Data.DataTable」。」用C 在LPBenchmarking.BLL.GetKPIFromPrime(PreKPIData DS,離羣值的Int32)::
源= 「LPBenchmarking」 棧跟蹤\文件 和設置\ RSpalding.TCI \我 文檔\庫\文件\ 2008的Visual Studio \項目\ LPB 優化\ LPBenchmarking_Web \ BusinessComponents \ BLL.vb:行 204的InnerException:

任何幫助,將不勝感激。謝謝。

+0

請注意,您的原始SQL不使用分組方式,並且存在拼寫錯誤:lf。和pf。應該是l。和p。想必。 – 2011-03-11 11:55:54

回答

0

嘗試劈裂查詢成若干子查詢,看看哪些工作(如果有的話):

Dim alq = From a In tmpActual _ 
Group Join l In tmpLocal On l.Item("Dates") Equals a.Item("Dates") Into al = Group 

Dim apq = _ 
From x In alq.DefaultIfEmpty() _ 
Group Join p In tmpProd On p.Item("Dates") Equals a.Item("Dates") Into ap = Group 

Dim adq = _ 
      From y In apq.DefaultIfEmpty() _ 
Group Join d In tmpDelta On d.Item("Dates") Equals a.Item("Dates") Into ad = Group 

Dim Xq = _ 
From z In adq.DefaultIfEmpty() _ 
Select 
    KPI = a.Item("KPI"), 
    ProcessDate = a.Item("Dates"), 
    AccountingActual = a.Item("AccountingActual"), 
    LocalForecast = x.Item("LocalForecast"), 
    ProdForecast = y.Item("ProdForecast"), 
    Localdelta = z.Item("LocalDelta"), 
    ProdDelta = z.Item("ProdDelta") 

Dim Xq1 = Xq.DefaultIfEmpty 

注我只是編輯您的SO提供的代碼 - 我沒有語法在IDE中檢查它!