繁体   English   中英

从SQL到Linq的查询具有多个左外部联接

[英]SQL to Linq query with multiple left outer joins

我正在尝试将SQL query转换为包含多个左外部联接的Linq ,但是遇到一种奇怪的情况。

我的SQL的相关部分是:

SELECT * FROM dbo.SessionDetails as sd
    left outer join dbo.VoipDetails as vd on vd.SessionIdTime = sd.SessionIdTime and vd.SessionIdSeq = sd.SessionIdSeq
    left outer join dbo.Gateways as fgw on vd.FromGatewayId = fgw.GatewayId

到目前为止,我的Linq查询是:

var query = from sd in dbo.SessionDetails
    join vd in dbo.VoipDetails on new { sd.SessionIdTime, sd.SessionIdSeq } equals new { vd.SessionIdTime, vd.SessionIdSeq } into sdvd
    from v in sdvd.DefaultIfEmpty()
         join fgw  in dbo.Gateways on vd.FromGatewayId equals fgw.GatewayId   into sdgw
         from g in sdvd.DefaultIfEmpty()
             select sd;

我在vd.FromGatewayId上收到一个错误标记,告诉我The name 'vd' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'. The name 'vd' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'.
但是,如果我确实用gw.GatewayId交换了双方,那么对于vdgw都会得到相同的错误消息。 有人可以在这里建议正确的语法吗? 请记住,在我掌握了基本语法之后,我还要添加几个左联接。

我认为问题在于您正在尝试访问查询中没有范围的值。 我相信这样做的原因是,您先指定关系船,然后将这些值分配给名为sdvd的集合,此时您无法使用vd。 就是说,然后您可以通过from v in sdvd.DefaultIfEmpty()from v in sdvd.DefaultIfEmpty()执行操作,这样您就可以访问sdvd中的行,这些行与您认为vd保持的值相同。 您应该能够使用v而不是vd 我不得不模拟一些东西进行测试,所以我无法完全测试出该查询,但是以下命令应该运行。

var query = from sd in dbo.SessionDetails
    join vd in dbo.VoipDetails on new { sd.SessionIdTime, sd.SessionIdSeq } equals new { vd.SessionIdTime, vd.SessionIdSeq } into sdvd
    from v in sdvd.DefaultIfEmpty()
        join fgw  in dbo.Gateways on v.FromGatewayId equals fgw.GatewayId   into sdgw
        from g in sdvd.DefaultIfEmpty()
            select sd;

编辑2014/12/08

为了查看linq语句如何转换为sql,建议您安装https://www.linqpad.net/ 您可以建立连接并在那里测试您的查询,并在结果视图中查看该sql。

由于我没有问题的数据结构,这将很难。 那就是我嘲笑的东西:

from sd in  Employees
    join vd in TimeEntries on new { sd.EmployeeID } equals new { vd.EmployeeID } into sdvd
    from v in sdvd.DefaultIfEmpty()
        join fgw  in EmployeeGroupDetails on v.EmployeeID equals fgw.EmployeeID   into sdgw
        from g in sdgw.DefaultIfEmpty()
            select  sd

这个产量:

SELECT [t0].*
FROM [Employee] AS [t0]
LEFT OUTER JOIN [TimeEntry] AS [t1] ON [t0].[EmployeeID] = [t1].[EmployeeID]
LEFT OUTER JOIN [EmployeeGroupDetail] AS [t2] ON [t1].[EmployeeID] = [t2].[EmployeeID]

它确实带有正确的联接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM