2012-09-02 2 views
0

를 컴파일하지 않습니다 :LINQ 문이 문은 컴파일되지 않습니다

query = from g in context.GridViews 
    join f in context.GridViewFavorites on g.ID equals f.GridViewID into gf 
    where g.GridTypeID == id && (g.IsShared == true || g.RepID == me.clsRep.OID) 
    && f.RepID == me.clsRep.OID 
    select g; 

컴파일러 오류가 이것이다 (그리고 그것은 어디 조항의 마지막 부분을 강조하는 것 :

이름 'F를 '현재 컨텍스트에 존재하지 않는 것은

그것은 논리적 SQL 대응이 될 것 :

declare @RepID int 
declare @GridTypeID int 
select @RepID=15, @GridTypeID=5 

select g.*,f.* 
from 
    GridViews g 
    left outer join GridViewFavorites f on f.GridViewID = g.ID 
where 
    g.GridTypeID = @GridTypeID and (g.IsShared = 1 or g.RepID == @RepID) 
    and f.RepID == @RepID 

참고 : @hdv의 풍어 당는 SQL 샘플이 실제로해야한다 :

select g.*,f.* 
from 
    GridView g 
    left outer join GridViewFavorite f on f.GridViewID = g.ID and f.RepID = @RepID 
where 
    g.GridTypeID = @GridTypeID and (g.IsShared = 1 or g.RepID = @RepID) 
+0

SQL 대응 항목이 내부 조인으로 작동한다는 것을 알고 있습니까? 'GridViewFavorites'가 발견되지 않으면,'f.RepID'는 결코 어떤 매개 변수와도 비교되지 않을 것입니다. 그것이 당신이 원하는 것이라면, 지금까지 얻은 답보다 더 간단 할 수 있습니다. – hvd

+0

@hvd, 전화하세요. 나는 흩어져있는 연산자의 나머지 부분을 통해 알 수 있듯이 SQL의 일종의 빠른 손을 썼다. 질문에 올바른 SQL을 게시 할 것입니다. 귀하의 질의에 대답하기 위해, 네, 아래의 답은 제가 찾고있는 것을 뒤쫓고 있습니다. – sisdog

답변

5

그건의 일부 "로"당신의 가입 - 당신이 그룹 "으로"에 가입 한 후, 조인 변수 (이 경우 f)가 범위를 벗어났습니다. 대신 gf을 사용해야합니다. 또는 실제로 이 아니며 검색어에gf을 사용하면 어쩌면 into gf 부분을 완전히 제거하여 그룹 가입 대신 일반 가입으로 처리해야합니다.

그러나 왼쪽 외부 조인을 제공하지는 않습니다. 당신이 왼쪽 외부 조인하려는 경우, 당신은 할 수 있습니다 :

query = from g in context.GridViews 
    join f in context.GridViewFavorites on g.ID equals f.GridViewID into gf 
    from f2 in gf.DefaultIfEmpty() 
    where g.GridTypeID == id && (g.IsShared == true || g.RepID == me.clsRep.OID) 
    && (f2 == null || f2.RepID == me.clsRep.OID) 
    select g; 
+0

내 질문에 통계를 채워 주셔서 감사합니다 @Skeet. 하나의 후속 질문 : "g"와 "f"의 조인을 "f2"로 표현한 후에 "f"가 아닌 where 절에서 "g"를 참조 할 수있는 이유는 무엇입니까? – sisdog

+0

@sisdog : 기본적으로'join x ... into y' 절이있을 때'x' 범위 변수는 그 결과가 그룹이기 때문에 그 join 절 내에서만 범위 내에 있습니다. 이미 범위에 있었던 다른 범위 변수는 범위에 있습니다. 만약 당신이'group ... into ...'*을 사용했다면, 이전의 모든 범위 변수는 범위를 벗어납니다. –

0

LINQ의 왼쪽 조인 패턴은 다음과 같이 진행됩니다

join f in context.GridViewFavorites on g.ID equals f.GridViewID into gf 
from f in gf.DefaultIfEmpty() //missing 

상세 정보 스택 오버플로 Google에서 사용할 수 있습니다.

+0

감사합니다. @usr, 나는 Stack Overflow 또는 Google을 확인하지 않았습니다. 큰 충고! – sisdog

0

where 절이 조인 된 결과에 적용되므로 f 변수가 범위에 포함되지 않습니다.

관련 문제