Winforms 将SQL转换为LINQ
我在处理这个SQL查询时遇到了困难。我需要把这个转换成LINQ,但到目前为止运气不好。林克尔完全失败了Winforms 将SQL转换为LINQ,winforms,sql-server-2008,linq-to-sql,c#-4.0,Winforms,Sql Server 2008,Linq To Sql,C# 4.0,我在处理这个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.JobBook
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
任何帮助都将不胜感激
问候。因为你真的希望你的答案是格式不好的,愚蠢的长,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})
老实说,我不知道这是否行得通,但我认为应该行。现在是希望有帮助的answr。我重组了您的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
假设它确实仍然可以工作,将查询分解成更小的部分,如果需要的话,一步一步地分解。我用lambda做这一切,因为我的主要语言是VB,而在线翻译人员不太擅长在源代码中翻译x中的ol。。。语法
然后左外连接原来是右外连接使用和
我担心我的语法可能会很混乱,但希望离你足够近,你能从中学习吗?祝你好运 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整数)不完全相同,但怀疑您需要基于别名的布尔值
另外,在您的数据库模型中,您可能会得到多行,因为一个城市可能属于多个县,这可能会偏离您的预期结果。C中的From语法就是这样工作的吗?我以为它是一个逗号分隔的列表,和VB一样?真正的问题,我真的不知道^^^事实上。。。你用什么语言回答?看起来它不会以任何方式编译吗?from语法将类似于小写。Select将不同,需要新的{}语法。下面是C:var query=from branch in branchs from job in branch.Jobs from booking in job.JobBookings选择new{County=branch.AddressInfo.City.County.Name,BookingID=booking.BookingID,JobID=job.OID,BookedFROM=booking.JobBookingStatusID=2}至于这是否会编译,我正在推断模型中实体之间的关联。如果关联不同,您可能需要修改查询。
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})
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)