2011-09-20 6 views
0
int id =2 ; 
(from t1 in Table1 
join t2 in Table2 
on new { t1.id, id} equals new { t2.id, t2.otherid } 
select t1).ToList(); 

현재 위의 쿼리는 나에게이 linq 쿼리를 올바르게 다시 쓰는 방법?

조인 식 중 하나 잘못의 유형을 말하는 컴파일 오류를 제공합니다.

위의 쿼리에서 볼 수 있듯이 SQL에서와 같이 단일 정수 값에 가입하고 싶습니다. 그래서 쿼리가 빠르며 모든 행을 가져온 다음 where 절로 필터한다는 것을 의미하기 때문에 끝에 위치를 지정하고 싶지는 않습니다. 두 테이블에 많은 행이 있으므로 join 절 자체에서 행을 필터링 할 수 있으면 좋을 것입니다. 당신의 도움을 주셔서 감사합니다 !

답변

4

당신은 모두 절반에 (동일한 속성 이름) 같은 익명 형식을 사용하는 데 필요한 조인

on new { t1.id, otherId = 2 } equals new { t2.id, t2.otherId } 

당신의 텍스트는 당신이 실제로 하나의 값에 가입하려는 것을 의미한다; 그렇다면 익명 유형은 필요하지 않습니다.

on t1.id equals t2.otherid 
4

익명 클래스를 사용하여 가입하면 해당 클래스 이름의 멤버가 일치해야합니다. 문제는 쉽게 익명 클래스의 멤버에 이름을 추가하여 해결 : 더 나는 그것을보고 더 나는 그 복잡 할 필요가 없습니다에 참여 실현

int id = 2; 

(from t1 in Table1 
join t2 in Table2 
on new { Id = t1.id, OtherId = id } 
    equals new { Id = t2.id, OtherId = t2.otherid } 
select t1).ToList(); 

,하지만. 조인에 정적 ID를 추가하는 것 같습니다. 당신은이 하나의 값으로 가입 줄일 WHERE 절에서 멀리 그것으로 얻을 수 있어야합니다 :

이 변형 프리 필터 표 2는 다음 조인을 수행

int id = 2; 

(from t1 in Table1 
from t2 in Table2 
on t1.id equals t2.id 
where t2.otherid = id 
select t1).ToList(); 
0

나는 두 가지 솔루션을 참조하십시오.

 int id =2; 
    (from t1 in Table1 
    join t2 in (from a in Table2 where a.otherid == id select a) 
    on t1.id equals t2.id 
    select t1).ToList();

다음은 원본 코드의 디버깅 된 변형입니다. 컴파일러는 익명 개체를 만들 때 속성 이름을 사용하기 때문에 이름에 대해 명시해야합니다.

 int id =2; 
    (from t1 in Table1 
    join t2 in Table2 
    on new { Id1 = t1.id, Id2 = id } equals new { Id1 = t2.id, Id2 = t2.otherid } 
    select t1).ToList();

HTH, 마크

관련 문제