[英]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
交换了双方,那么对于vd
和gw
都会得到相同的错误消息。 有人可以在这里建议正确的语法吗? 请记住,在我掌握了基本语法之后,我还要添加几个左联接。
我认为问题在于您正在尝试访问查询中没有范围的值。 我相信这样做的原因是,您先指定关系船,然后将这些值分配给名为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.