组连接多个表将SQL转换为Linq

时间:2011-03-07 23:22:04

标签: .net vb.net linq linq-to-sql group-by

任何人都可以通过将此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   Message =“无法转换类型的对象   'd__9e 1[VB$AnonymousType_6 7 [System.Object的,System.Object的,System.Object的,System.Object的,System.Object的,System.Object的,System.Object的]]'   输入'System.Data.DataTable'。“   Source =“LPBenchmarking”StackTrace:          在LPBenchmarking.BLL.GetKPIFromPrime(PreKPIData   C:\ Documents中的ds,Int32异常值)   和设置\ RSpalding.TCI \我的   文档\库\文档\ Visual   Studio 2008 \ Projects \ LPB   优化\ LPBenchmarking_Web \ BusinessComponents \ BLL.vb:行   204 InnerException:

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分: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中检查它的语法!