2014-12-07 8 views
1

왼쪽 외부 조인을 포함하는 SQL queryLinq으로 변환하려고하지만 이상한 상황이 발생합니다.여러 개의 왼쪽 외부 조인을 사용하는 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 쿼리는 지금까지입니다 : 그 The name 'vd' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'.
그러나 말해 vd.FromGatewayId

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; 

내가 오류 표시를 얻고, gw.GatewayId으로면을 바꾸면 vdgw에 대해 동일한 오류 메시지가 표시됩니다. 누군가 올바른 구문을 제안 할 수 있습니까? 기본 구문을 삭제 한 후에 추가 할 여러 개의 왼쪽 조인이 있습니다.

답변

2

나는 쿼리에서 범위가없는 값에 액세스하려고하는 것이 문제라고 생각합니다. 그 이유는 관계 우주선을 지정하고이 값을 sdvd 콜렉션에 할당하면이 시점에서 vd를 얻을 수 없다는 것입니다. 그렇다면 from v in sdvd.DefaultIfEmpty()을 수행하면 sdvd의 행에 액세스 할 수 있습니다.이 값은 vd과 같은 값입니다. vd 대신 v을 사용할 수 있어야합니다. 나는이 쿼리를 정확히 테스트 할 수 없도록 테스트 할 무언가를 모의해야했지만 다음을 실행해야합니다.

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월 8일는

는 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] 

그건 내가 뭔가를 조롱했다.

+0

나는 오해를 당할 수도 있지만, 왼쪽 외부 조인을 계속하기 위해서는'on v.FromGatewayId와 같아야합니다. fgw.Gateway는'sdgw.DefaultIfEmpty()'에서 g에서 sdgw로' sdvd.DefaultIfEmpty()'다시? – Black