Поскольку вы действительно хотели, чтобы ваш ответ был в плохо отформатированном, тупо длинном 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})
Боюсь, что мой синтаксис, вероятно, будет диким, но, надеюсь, достаточно близким для васработать? Удачи!