[C#] 단일 결합의 여러 필드에서 LINQ의 결합을 수행하는 방법

두 개 이상의 필드에서 조인을 수행하는 LINQ2DataSet 쿼리를 수행해야합니다.

var result = from x in entity
join y in entity2 
       on x.field1 = y.field1 
and 
          x.field2 = y.field2

아직 적절한 솔루션 (I는 where 절에 여분의 제약 조건을 추가 할 수 있지만이 적절한 해결책에서 멀리, 또는 사용 발견 솔루션을하지만은 동등 조인을 가정).

LINQ에서 단일 조인으로 여러 필드를 조인 할 수 있습니까?

편집하다

var result = from x in entity
             join y in entity2
             on new { x.field1, x.field2 } equals new { y.field1, y.field2 }

위의 equijoin을 가정하여 언급 한 솔루션입니다.

추가 편집

내 원래의 예가 동등 (equijoin)이라는 비판에 대답하기 위해, 나는 현재 요구 사항이 동등 (equijoin)에 대한 것이며 이미 위에서 언급 한 솔루션을 사용했음을 인정합니다.

그러나 LINQ에 어떤 가능성과 모범 사례를 적용해야하는지 이해하려고 노력하고 있습니다. 곧 테이블 ID로 날짜 범위 쿼리 조인을 수행해야하며 해당 문제를 선점했습니다 .where 절에 날짜 범위를 추가 해야하는 것처럼 보입니다.

주어진 모든 제안과 의견에 대해 언제나 감사합니다.



답변

익명 유형의 솔루션이 제대로 작동합니다. LINQ (조인 절을 사용하여) equijoin 만 나타낼 있으며 실제로는 원래 쿼리를 기반으로 표현하고 싶다고 말한 것입니다.

특정 이유로 익명 유형의 버전이 마음에 들지 않으면 해당 이유를 설명해야합니다.

원래 요청한 것과 다른 것을 하고 싶다면 실제로 하고 싶은 일의 예를 들어주십시오 .

편집 : 질문의 편집에 응답 : 예, “날짜 범위”결합을 수행하려면 대신 where 절을 사용해야합니다. 그것들은 실제로 의미 적으로 동등하므로 사용 가능한 최적화의 문제 일뿐입니다. Equijoins는 내부 시퀀스를 기반으로 조회를 생성하여 간단한 최적화 (LINQ to Objects, LINQ to DataSet 포함)를 제공합니다. 키에서 해당 키와 일치하는 항목 시퀀스까지의 해시 테이블로 생각하십시오.

날짜 범위로 처리하는 것이 다소 어렵습니다. 그러나 “날짜 범위 조인”이 의미하는 바에 따라 비슷한 작업을 수행 할 수 있습니다. 날짜에 “밴드”를 생성하려는 경우 (예 : 연 1 회) 같은 연도 (동일한 날짜는 아님)가 일치해야하며, 해당 밴드를 키로 사용하면됩니다. 더 복잡한 경우, 예를 들어 조인의 한 쪽이 범위를 제공하고 조인의 다른 쪽이 단일 날짜를 제공하여 해당 범위 내에 있으면 일치하는 where조항으로 처리하는 것이 더 좋습니다 (1 초 후)from조항) IMO. 한 쪽 또는 다른 쪽을 주문하여보다 효율적으로 일치하는 항목을 찾으면 특히 펑키 한 마술을 할 수 있지만 많은 작업이 필요합니다. 성능이 문제인지 확인한 후에 만 ​​그런 일을 할 것입니다.


답변

var result = from x in entity
   join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 }


답변

var result = from x in entity1
             join y in entity2
             on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }

두 엔티티에서 열 이름이 다른 경우이를 수행해야합니다.


답변

동등한 메소드 체인 구문으로이를 완료하십시오.

entity.Join(entity2, x => new {x.Field1, x.Field2},
                     y => new {y.Field1, y.Field2}, (x, y) => x);

마지막 인수 (x, y) => x는 당신이 선택 하는 반면 (위의 경우 우리는을 선택합니다 x).


답변

더 읽기 쉽고 유연한 옵션은 Where 함수를 사용하는 것입니다.

var result = from x in entity1
             from y in entity2
                 .Where(y => y.field1 == x.field1 && y.field2 == x.field2)

또한 .DefaultIfEmpty ()를 추가하여 내부 조인에서 왼쪽 조인으로 쉽게 변경할 수 있습니다.


답변

var result = from x in entity
             join y in entity2
             on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }
             select new
             {
               /// Columns
              };


답변

당신은 (아래)와 같은 것을 할 수 있습니다

var query = from p in context.T1

        join q in context.T2

        on

        new { p.Col1, p.Col2 }

        equals

         new { q.Col1, q.Col2 }

        select new {p...., q......};