方法 : 左外部結合を実行する (C# プログラミング ガイド)

更新 : 2007 年 11 月

左外部結合は、2 番目のコレクションに相関関係を持つ要素があるかどうかに関係なく、最初のコレクションの各要素が返される結合です。LINQ を使用すると、グループ結合の結果に対して DefaultIfEmpty を呼び出すことで、左外部結合を実行できます。

使用例

グループ結合の結果で DefaultIfEmpty メソッドを使用して、左外部結合を実行する方法の例を次に示します。

2 つのコレクションの左外部結合を作成する最初の手順では、グループ結合を使用して内部結合を実行します (このプロセスの詳細については、「方法 : 内部結合を実行する (C# プログラミング ガイド)」を参照してください)。この例では、Person オブジェクトの一覧は、Pet.Owner と一致する Person オブジェクトに基づいて、Pet オブジェクトの一覧に内部結合されます。

2 番目の手順では、右側のコレクションに一致する要素がない場合でも、最初 (左側) のコレクションの各要素を結果セットに含めます。これを行うには、グループ結合から一致する要素の各シーケンスで DefaultIfEmpty を呼び出します。この例では、一致する Pet オブジェクトの各シーケンスで DefaultIfEmpty が呼び出されます。一致する Pet オブジェクトのシーケンスがすべての Person オブジェクトに対して空の場合、各 Person オブジェクトが結果コレクションに表示されるように、1 つの既定値を含むコレクションが返されます。

Bb397895.alert_note(ja-jp,VS.90).gifメモ :

参照型の既定値は 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.Core.dll への参照を追加します。

  • System.Linq 名前空間を含めます。

  • 例からコードをコピーし、program.cs ファイルの Main メソッドの下に貼り付けます。貼り付けたメソッドを呼び出すコード行を Main メソッドに追加します。

  • プログラムを実行します。

参照

処理手順

方法 : 内部結合を実行する (C# プログラミング ガイド)

方法 : グループ化結合を実行する (C# プログラミング ガイド)

概念

結合演算

匿名型

参照

Join

GroupJoin

匿名型 (C# プログラミング ガイド)