Конвертировать SQL в LINQ - PullRequest
0 голосов
/ 25 июля 2011

Мне тяжело с этим SQL-запросом.Мне нужно преобразовать это в LINQ, но пока не повезло.Linqer просто терпит неудачу.

SELECT dbo.County.Name AS County,
       dbo.JobBooking.OID AS BookingID,
       dbo.Job.OID AS JobID,
       CASE JobBooking.JobBookingStatusID WHEN 2 THEN 1 ELSE 0 END AS Booked
FROM   dbo.JobBooking RIGHT OUTER JOIN
       ((((dbo.Branch INNER JOIN
       dbo.Job ON dbo.Branch.OID = dbo.Job.BranchID) INNER JOIN
       dbo.AddressInfo ON dbo.Branch.AddressInfoID = dbo.AddressInfo.OID) 
       INNER JOIN
       dbo.City ON dbo.AddressInfo.CityID = dbo.City.OID) INNER JOIN
       dbo.County ON dbo.City.CountyID = dbo.County.OID)
       ON dbo.JobBooking.JobID = dbo.Job.OID

Любая помощь будет принята с благодарностью!

С уважением.

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Поскольку вы действительно хотели, чтобы ваш ответ был в плохо отформатированном, тупо длинном VB.Net одном файле ...

Dim results = db.Branches.Join(db.Jobs,
                               Function(n) n.OID,
                               Function(n) n.BranchID,
                               Function(nBranch, nJob) New With {.Branch = nBranch,
                                                                 .Job = nJob}).Join(db.AddressInfos,
                                                                                    Function(n) n.Branch.AddressInfoID,
                                                                                    Function(n) n.OID,
                                                                                    Function(n, nAddressInfo) New With {.Branch = n.Branch,
                                                                                                                        .Job = n.Job,
                                                                                                                        .AddressInfo = nAddressInfo}).Join(db.Cities,
                                                                                                                                                                   Function(n) n.AddressInfo.CityID,
                                                                                                                                                                   Function(n) n.OID,
                                                                                                                                                                   Function(n, nCity) New With {.Branch = n.Branch,
                                                                                                                                                                                                .Job = n.Job,
                                                                                                                                                                                                .AddressInfo = n.AddressInfo,
                                                                                                                                                                                                .City = nCity}).Join(db.Counties,
                                                                                                                                                                                                                     Function(n) n.City.CountyID,
                                                                                                                                                                                                                     Function(n) n.OID,
                                                                                                                                                                                                                     Function(n, nCounty) New With {.Branch = n.Branch,
                                                                                                                                                                                                                                                    .Job = n.Job,
                                                                                                                                                                                                                                                    .AddressInfo = n.AddressInfo,
                                                                                                                                                                                                                                                    .City = n.City,
                                                                                                                                                                                                                                                    .County = nCounty}).GroupJoin(db.JobBookings,
                                                                                                                                                                                                                                                                                  Function(n) n.Job.OID,
                                                                                                                                                                                                                                                                                  Function(n) n.JobID,
                                                                                                                                                                                                                                                                                  Function(n, nJobBooking) New With {.County = n.County.Name,
                                                                                                                                                                                                                                                                                                                     .BookingID = nJobBooking.OID,
                                                                                                                                                                                                                                                                                                                     .JobID = n.Job.OID,
                                                                                                                                                                                                                                                                                                                     .Booked = nJobBooking.DefaultIfEmpty IsNot Nothing AndAlso nJobBooking.DefaultIfEmpty.JobBookingStatusID = 2})

Честно говоря, я не знаю, сработает ли это, но ядумаю, что должно.Теперь для ответа, который, надеюсь, поможет.Я реструктурировал ваш SQL, чтобы упростить его перевод на Linq. Возможно, вы могли бы подтвердить, что он по-прежнему работает?

SELECT  dbo.County.Name AS County,
        dbo.JobBooking.OID AS BookingID,
        dbo.Job.OID AS JobID,
        CASE JobBooking.JobBookingStatusID WHEN 2 THEN 1 ELSE 0 END AS Booked
FROM    dbo.Branch INNER JOIN dbo.Job ON dbo.Branch.OID = dbo.Job.BranchID
        INNER JOIN dbo.AddressInfo ON dbo.Branch.AddressInfoID = dbo.AddressInfo.OID
        INNER JOIN dbo.City ON dbo.AddressInfo.CityID = dbo.City.OID
        INNER JOIN dbo.County ON dbo.City.CountyID = dbo.County.OID
        LEFT OUTER JOIN dbo.JobBooking  ON dbo.JobBooking.JobID = dbo.Job.OID

Предполагая, что он действительно работает, разбейте запрос на более мелкие части, шаг за шагом, если потребуется.быть.Я делаю все это в лямбда-выражении (потому что мой основной язык - VB, и онлайн-переводчики не слишком умны в переводе синтаксиса ol From x In source....

var branchesAndJobs = db.Branches.Join(db.Jobs, n => n.OID, n => n.BranchID, (n, nJob) => new {Branch = n, Job = nJob})
var branchesJobsAndAddressInfos = branchesAndJobs.Join(db.AddressInfos, n => n.Branch.AddressInfoID, n => n.OID, (n, nAddressInfo) => new {Branch = n.Branch, Job = n.Job, AddressInfo = n.AddressInfo})
// etc through all the normal joins

Затем левое внешнее объединение (изначально правоеexternal) использует GroupJoin и DefaultIfEmpty ...

var results = allOtherData.GroupJoin(db.JobBookings, n => n.Job.OID, n => n.JobID, (n, nJobBooking) => new {County = n.County.Name, BookingID = nJobBooking.DefaultIfEmpty == null ? null : nJobBooking.DefaultIfEmpty.OID, etc = n.etc})

Боюсь, что мой синтаксис, вероятно, будет диким, но, надеюсь, достаточно близким для васработать? Удачи!

0 голосов
/ 25 июля 2011

LINQ не поддерживает правосторонние соединения. Вам нужно будет преобразовать это в левое внешнее вместо использования метода расширения DefaultIfEmpty.

В этом случае вместо того, чтобы пытаться сконфигурировать кучу объединений, либо разбейте запрос на логические порции, либо измените свое мышление на использование вместо этого графа объектов. Графы объектов по умолчанию используют внешние соединения, а не внутренние, поэтому вам не нужен DefaultIfEmpty при использовании графа объектов. Посмотрите, поможет ли следующее:

Dim query = From branch In Branches
            From job In branch.Jobs
            From booking In job.JobBookings
            Select County = branch.AddressInfo.City.County.Name,
                   BookingID = booking.BookingID,
                   JobID = job.OID,
                   BookedFROM = (booking.JobBookingStatusID = 2)

Это не совсем то же самое, что я возвращаю логическое значение для BookedFROM, а не целое число 0/1, но подозреваю, что вы хотите логическое значение здесь на основе псевдонима.

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

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