재우니의 블로그

 

linq 로 model 을 left outer joins 로 만들어보기

https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-left-outer-joins

 

Perform left outer joins (LINQ in C#)

Learn how to perform left outer joins using LINQ in C#.

docs.microsoft.com

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:

 

inner join 에 대한 샘플 강좌는 아래 링크에 설명되어 있습니다.

https://docs.microsoft.com/ko-kr/dotnet/csharp/linq/perform-inner-joins

 

내부 조인 수행(C#의 LINQ)

C#에서 LINQ를 사용하여 내부 조인을 수행하는 방법을 알아봅니다.

docs.microsoft.com