left outer join 은 두 번째 컬렉션에 상호 연결된 요소가 있는지 여부에 관계없이 첫 번째 컬렉션의 각 요소가 반환되는 조인입니다.LINQ를 통해 그룹 조인의 결과에서DefaultIfEmpty메서드를 호출하여 left outer join 을 수행할 수 있습니다.
예제
다음 예제에서는 그룹 조인의 결과에서DefaultIfEmpty메서드를 사용하여 왼쪽 우선 외부 조인을 수행하는 방법을 보여 줍니다.
두 컬렉션을 left outer join 로 생성하는 첫 번째 단계는 group join 을 사용하여 innner join 을 수행하는 것입니다.이 예제에서Person개체 목록은Pet.Owner와 일치하는Person개체를 기준으로Pet개체 목록에 inner-joined 됩니다.
두 번째 단계는 오른쪽 컬렉션에 일치하는 항목이 없는 경우에도 첫 번째(왼쪽) 컬렉션의 각 요소를 결과 집합에 포함하는 것입니다.이렇게 하려면 group join 에서 일치하는 요소의 각 시퀀스에 대해DefaultIfEmpty를 호출합니다.이 예제에서는 일치하는Pet개체의 각 시퀀스에서DefaultIfEmpty를 호출합니다.메서드는Person개체에 대해 일치하는Pet개체의 시퀀스가 비어 있는 경우, 단일 기본값을 포함하는 컬렉션을 반환하여 각Person개체가 결과 컬렉션에 반환되도록 합니다.
참조 형식의 기본값은null 이므로 예제에서는 각Pet컬렉션의 각 요소에 액세스하기 전에 null 참조를 확인합니다.
left outer join 샘플 예제
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?.Name ?? String.Empty };
foreach (var v in query)
{
Console.WriteLine($"{v.FirstName+":",-15}{v.PetName}");
}
}
// This code produces the following output:
//
// Magnus: Daisy
// Terry: Barley
// Terry: Boots
// Terry: Blue Moon
// Charlotte: Whiskers
// Arlene: