Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 将SQL转换为LINQ_Winforms_Sql Server 2008_Linq To Sql_C# 4.0 - Fatal编程技术网

Winforms 将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

我在处理这个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.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)