Групповые объединения с несколькими таблицами, конвертирующие SQL в Linq - PullRequest
1 голос
/ 08 марта 2011

Может ли кто-нибудь помочь мне, переведя этот оператор 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]]' набрать 'System.Data.DataTable'. "
Source = "LPBenchmarking" StackTrace: на LPBenchmarking.BLL.GetKPIFromPrime (PreKPIData ds, выбросы Int32) в C: \ Documents и настройки \ RSpalding.TCI \ My Документы \ Библиотеки \ Documents \ Визуальное Studio 2008 \ Проекты \ ЛПБ Оптимизация \ LPBenchmarking_Web \ BusinessComponents \ BLL.vb: линия 204 InnerException:

Любая помощь будет оценена. Благодарю.

1 Ответ

0 голосов
/ 11 марта 2011

Попробуйте разбить запрос на несколько подзапросов и посмотрите, какие из них работают (если есть):

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 - Iне проверял синтаксис в IDE!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...