방법: 왼쪽 외부 조인 수행(C# 프로그래밍 가이드)
업데이트: 2007년 11월
왼쪽 외부 조인은 두 번째 컬렉션에 연관된 요소가 있는지 여부에 상관없이 첫 번째 컬렉션의 각 요소가 반환되는 조인입니다. LINQ를 사용하면 그룹 조인의 결과에서 DefaultIfEmpty을 호출하여 왼쪽 외부 조인을 수행할 수 있습니다.
예제
다음 예제에서는 그룹 조인의 결과에서 DefaultIfEmpty 메서드를 사용하여 왼쪽 외부 조인을 수행하는 방법을 보여 줍니다.
두 컬렉션의 왼쪽 외부 조인을 생성하는 첫 번째 단계는 그룹 조인을 사용하여 내부 조인을 수행하는 것입니다. 이 프로세스에 대한 설명은 방법: 내부 조인 수행(C# 프로그래밍 가이드)을 참조하십시오. 이 예제에서 Person 개체 목록은 Pet.Owner와 일치하는 Person 개체를 기반으로 Pet 개체 목록에 내부 조인됩니다.
두 번째 단계는 해당 요소가 오른쪽 컬렉션에 일치하는 항목이 없는 경우에도 결과 집합에서 첫 번째(왼쪽) 컬렉션의 각 요소를 포함하는 것입니다. 이렇게 하려면 그룹 조인에서 일치하는 요소의 각 시퀀스에 DefaultIfEmpty를 호출합니다. 이 예제에서는 일치하는 Pet 개체의 각 시퀀스에서 DefaultIfEmpty가 호출됩니다. 임의의 Person 개체에 대해 일치하는 Pet 개체의 시퀀스가 비어 있는 경우 단일 기본값이 포함된 컬렉션이 반환되므로 결과 컬렉션에서 각 Person 개체가 나타나게 됩니다.
참고: |
---|
참조 형식의 기본값은 null입니다. 따라서 예제에서는 각 Pet 컬렉션의 각 요소에 액세스하기 전에 null 참조를 검사합니다. |
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
public static void LeftOuterJoinExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };
Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };
var query = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };
foreach (var v in query)
{
Console.WriteLine("{0,-15}{1}", v.FirstName + ":", v.PetName);
}
}
// This code produces the following output:
//
// Magnus: Daisy
// Terry: Barley
// Terry: Boots
// Terry: Blue Moon
// Charlotte: Whiskers
// Arlene:
코드 컴파일
Visual Studio에서 콘솔 응용 프로그램 프로젝트를 새로 만듭니다.
아직 참조되지 않았다면 System.Core.dll에 대한 참조를 추가합니다.
System.Linq 네임스페이스를 포함합니다.
예제에서 코드를 복사하여 Main 메서드 아래의 program.cs 파일에 붙여넣습니다. Main 메서드에 코드 줄을 추가하여 붙여넣은 메서드를 호출합니다.
프로그램을 실행합니다.