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

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

使用例

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

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

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

注意

参照型の既定値はです null; したがって、この例では null 参照を持つように Pet の各コレクションの各要素にアクセスする前に確認します。

        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 クラスの Main のメソッドの下に program.cs ファイルに例からコードをコピーして貼り付けます。 LeftOuterJoinExample のメソッドを呼び出すに Main のメソッドのコード行を追加します。

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

参照

処理手順

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

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

関連項目

Join

GroupJoin

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

概念

結合演算

匿名型 (Visual Basic)