메소드 구문을 사용하여 linq에서 SQL에 조인하는 방법은 무엇입니까?


193

쿼리 구문에서 조인을 수행하는 방법에 대한 LINQ to SQL 예제의 많은 예제를 보았지만 메소드 구문으로 어떻게 수행하는지 궁금합니다. 예를 들어 다음을 수행하는 방법

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc }

와 함께 .Join()? 누구든지 다른 간단한 예를 설명하거나 제공 할 수 있습니까?

답변:


285
var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc };

다음과 같습니다.

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new
                       {
                           SomeClass = sc,
                           SomeOtherClass = soc
                       });

보시다시피, 조인과 관련하여 쿼리 구문은 일반적으로 람다 구문보다 훨씬 더 읽기 쉽습니다.


129

Justin은 조인 직후에 a가 나오는 경우 확장을 올바르게 표시했습니다 select. 다른 식별자가 있으면 투명한 식별자 로 인해 까다로워집니다 . C # 컴파일러가 조인의 양쪽 절반 범위를 전파하는 데 사용하는 메커니즘입니다.

따라서 Justin의 예제를 약간 변경하려면 다음을 수행하십시오.

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             where sc.X + sc.Y == 10
             select new { SomeClass = sc, SomeOtherClass = soc }

다음과 같이 변환됩니다.

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new { sc, soc })
    .Where(z => z.sc.X + z.sc.Y == 10)
    .Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc });

다음 z은 투명 식별자입니다. 투명하기 때문에 원래 쿼리에서 볼 수 없습니다. :)


5

where 절을 사용하여 세 번째 다른 유형의 새 객체 (예 : Entity Framework 객체가 아닌 객체)를 만들려면 여기에 다른 답변을 추가하십시오.

public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> property1Values)
{
    using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext )
    {
        var result = entityFrameworkObjectContext.SomeClass
            .Join(entityFrameworkObjectContext.SomeOtherClass,
                sc => sc.property1,
                soc => soc.property2,
                (sc, soc) => new {sc, soc})
            .Where(s => propertyValues.Any(pvals => pvals == es.sc.property1)
            .Select(s => new ThirdNonEntityClass 
            {
                dataValue1 = s.sc.dataValueA,
                dataValue2 = s.soc.dataValueB
            })
            .ToList();
    }

    return result;

}    

Where 및 Select 절에서 생성 된 중간 개체에 특히주의하십시오.

여기에서는 입력 목록에있는 속성 중 하나와 일치하는 property1을 갖는 결합 된 개체도 찾습니다.

나는 이것이 원래 질문자가 찾고 있던 것보다 조금 더 복잡하다는 것을 알고 있지만, 누군가에게 도움이되기를 바랍니다.

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