2013-04-08 5 views
7

내가 SO와 other sitesvarious questions을 검토 한 결과,이 그러나 그냥 작동하지 않습니다, LINQ의 JOIN을 수행 할 수있는 올바른 구문으로를 나타납니다LINQ JOIN에서 구문 오류가 있습니까?

var stages = (from stage in entityManager.TPM_TASKSTAGE select stage); 
var results = (from task in pv.TPM_TASK 
       join st in stages on st.STAGEID equals task.STAGEID 
       where task.TASKTYPE == "Solution" 
       select new SolutionTask()); 

무시, 지금은 사실 실제로는 을 선택하지 말고을 선택하십시오. 그러나 TPM_TASK의 각 행에 st.NAME 속성에 대한 액세스 권한을 갖고 싶습니다. 두 테이블은 STAGEID에 의해 연결됩니다. LINQ 가입 표현에서

The name 'st' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'.

, 모두 sttask 빨간색 squigglies이 : 나는 컴파일러 오류가 발생합니다. 내가 바보 같은 짓하고 있다고 말해줘.

+1

오류 메시지의 정확한 지침을 따라 시도해 보셨습니까? (" 'equals'의 양쪽에서 표현식을 바꾸는 것을 고려하십시오.) –

+0

@JonSkeet - 실제로 시도한 * 첫 번째 표현 이었지만 표현식은'task.STAGEID == st.STAGEID'였습니다. 이 비슷한 컴파일러 오류 (식을 바꿀 제안). 그래서 나는 변화를 가져올 수도있는 '평등'한 생각으로 전환했습니다. 나는'task.STAGEID equals st.STAGEID'와 같은 유효한 조합을 시도하지 않았습니다! 한숨. –

+0

'task.STAGEID == st.STAGEID'가 있었을 때 같은 오류 메시지가 나타나지 않았을 것입니다. 왜냐하면 당신의 조인은 그 시점에서 완전히 완전하지 않기 때문입니다. –

답변

11

외부 순서의 키 선택자가 먼저 가야합니다. 귀하의 경우 외부 순서는 pv.TPM_TASK입니다. 따라서 task.STAGEID equals st.STAGEID

var stages = (from stage in entityManager.TPM_TASKSTAGE select stage); 
var results = (from task in pv.TPM_TASK 
       join st in stages on task.STAGEID equals st.STAGEID // here 
       where task.TASKTYPE == "Solution" 
       select new SolutionTask()); 
+1

까다로운 컴파일러. 정말 고마워! –

+0

@MikeChristensen : 정말 까다 롭지는 않습니다. '평등 '의 양측은 완전히 다른 범위를 가지고있다 : 왼쪽은'성'에 대한 지식이 없으며, 오른쪽은'작업'에 대한 지식이 없다. 이런 종류의 경우 쿼리 식 구문이 실제로 무엇을 의미하는지 생각하는 것이 유용합니다. 자세한 내용은 http://msmvps.com/blogs/jon_skeet/archive/2011/01/28/reimplementing-linq-to-objects-part-41-how-query-expressions-work.aspx를 참조하십시오. –

+0

@JonSkeet - 정보를 제공해 주셔서 감사합니다! 나는 LINQ 초심자 일 뿐이며, 조인과 같은 더 복잡한 것들에 관해서는 쉽게 버려집니다. 나는 피연산자의 순서가 중요하지 않은 SQL JOIN과 비슷하게 작동하는 것으로 생각했다. –

관련 문제