C# 具有多个左外部联接的SQL到Linq查询
我试图将一个C# 具有多个左外部联接的SQL到Linq查询,c#,linq,entity-framework,join,entity-framework-4,C#,Linq,Entity Framework,Join,Entity Framework 4,我试图将一个SQL查询转换为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
SQL查询
转换为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
告诉我名称“vd”不在“equals”左侧的范围内。考虑在“相等”的两边交换表达式。< /代码> BR>
但是,如果我确实使用gw.GatewayId
交换了边,那么vd
和gw
都会收到相同的错误消息。
有人能在这里建议正确的语法吗?
请记住,在我记下基本语法后,还有几个连接需要添加。我认为问题在于您试图访问的值在查询中没有作用域。我认为这样做的原因是,您指定了关系,然后将这些值分配给名为sdvd
的集合,此时您无法访问vd。也就是说,您可以从sdvd.DefaultIfEmpty()
中的v执行,这样您就可以访问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,我建议您安装。您可以在那里设置连接并测试查询,然后在结果视图中查看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]
它确实返回了右连接。我可能会误解,但为了继续进行左外部连接,v上的,FromGatewayId是否应该等于fgw.GatewayId,从sdgw.DefaultIfEmpty()中的g进入sdgw。
而不是sdvd.DefaultIfEmpty()
?