programing tip

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

itbloger 2020. 10. 10. 09:42
반응형

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


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 문서를 찾을 수없는 것 같습니다.


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

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 }

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

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 }

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

참고 URL : https://stackoverflow.com/questions/7664727/linq-join-with-multiple-conditions-in-on-clause

반응형