On 절에 여러 조건이있는 LINQ 조인


93

ON 절에 여러 조건이있는 왼쪽 외부 조인을 사용하는 쿼리를 LINQ에서 구현하려고합니다.

다음 두 테이블 Project (ProjectID, ProjectName) 및 Task (TaskID, ProjectID, TaskName, Completed) 의 예제를 사용합니다 . 각 작업과 함께 모든 프로젝트의 전체 목록을보고 싶지만 완료된 작업 만보고 싶습니다.

Completed == true작업을 완료하지 않은 프로젝트를 필터링하기 때문에 필터를 사용할 수 없습니다 . 대신 Completed == true조인의 ON 절에 추가 하여 전체 프로젝트 목록이 표시되지만 완료된 작업 만 표시됩니다. 완료된 작업이없는 프로젝트는 작업에 대해 null 값이있는 단일 행을 표시합니다.

다음은 쿼리의 기초입니다.

from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

&& t2.Completed == trueon 절에 어떻게 추가 합니까?

이 작업을 수행하는 방법에 대한 LINQ 문서를 찾을 수없는 것 같습니다.


관련 대답 여기 람다를 사용하여 구문
StuartLC

답변:


131

익명 속성의 이름을 양쪽에서 동일하게 지정하면됩니다.

on new { t1.ProjectID, SecondProperty = true } equals 
   new { t2.ProjectID, SecondProperty = t2.Completed } into j1

@svick의 의견에 따라 다음은 더 합리적 일 수있는 또 다른 구현입니다.

from t1 in Projects
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
                .DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

2
그렇게하는 것은 명백하지 않은 방법 인 것 같습니다. 나는 그것이 무엇을해야하는지 이해할 수 있을지 모르겠습니다.
svick

1
@svick-익명 유형을 사용하면 여러 기준으로 참여할 수 있습니다. 속성 이름이 두 유형 모두에서 일치하는지 확인하기 만하면됩니다. 혼란이 어디서 오는지 잘 모르시겠습니까?
Aducci 2011 년

혼란스러운 점 and은 어떤 "이상한"객체의 하나의 동등성이 아니라 에 의해 결합 된 두 개의 동등이 실제로 더 의미가 있다는 것 입니다. 그리고 내 요점을 증명하기 위해 귀하의 코드가 잘못되었습니다. 작동 true하려면 왼쪽과 t2.Complete오른쪽에 있어야합니다.
svick 2011 년

1
감사합니다 Aducci. 컨텍스트를 올바르게 얻기 위해 쿼리에서 측면을 바꿔야했지만 작동했습니다. 이 문제는 간단하며 실제 문제에서는 SecondProperty가 true 또는 false가 아니라 SecondProperty가 정수이고 AND SecondProperty IN (123, 456). 나는 그 도전으로 넘어갈 것이고 당신이 줄 수있는 어떤 도움이라도 대단히 감사 할 것입니다.
Kuyenda 2011 년

@svick - 캐치 좋은, 나는의 순서로 전환 t2.Completed진정한 가치를. 덜 이상 할 수있는 다른 솔루션을 추가했습니다.
Aducci 2011 년

39

여기에 다음이 포함됩니다.

from b in _dbContext.Burden 
join bl in _dbContext.BurdenLookups on
new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }

이것은 더 이해하기 쉬워 보입니다.
Bijay Yadav 19

1

당신은 그렇게 할 수 없습니다. join절 (및 Join()확장 방법)에만 결 합을 지원합니다. 그것은 또한 사용 equals하지 않는 이유 ==입니다. 그리고 그렇게 할 수 있다고해도 작동하지 않을 것 join입니다. 왜냐하면는 외부 조인이 아니라 내부 조인 이기 때문 입니다.


외부 조인은 요청되지 않았으며 (다른 답변 참조) 분명히 할 수 있습니다.
edc65

0

이것은 2 개의 테이블에서 잘 작동합니다. 3 개의 테이블이 있고 on 절은 3 개의 테이블에서 2 개의 조건을 연결해야합니다. 내 코드 :

_dbContext.Products의 p에서 p.ProduktId의 _dbContext.ProductVariants에서 pv를 조인합니다. ProductId = jpr.Prices.ProduktID}를 lj로

그러나이 시점에서 표시되는 오류 : p.ProduktId의 _dbContext.ProductVariants에서 pv를 조인하면 pv.ProduktId와 같습니다.

오류 : 결합 절의 표현식 중 하나의 유형이 올바르지 않습니다. 'GroupJoin'호출에서 유형 유추에 실패했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.