Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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
C# 具有多个左外部联接的SQL到Linq查询_C#_Linq_Entity Framework_Join_Entity Framework 4 - Fatal编程技术网

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()