Gewusst wie: Ausführen linker äußerer Verknüpfungen (C#-Programmierhandbuch)

Ein linker äußerer Join ist ein Join, in dem jedes Element aus der ersten Auflistung zurückgegeben wird, unabhängig davon, ob korrelierte Elemente in der zweiten Auflistung dafür zur Verfügung stehen. Mit LINQ können Sie einen linken äußeren Join ausführen, indem Sie DefaultIfEmpty für die Ergebnisse eines Group Joins aufrufen.

Beispiel

Das folgende Beispiel veranschaulicht, wie die DefaultIfEmpty-Methode auf die Ergebnisse des Group Joins angewendet wird, um einen linken äußeren Join auszuführen.

Der erste Schritt beim Erstellen eines linken äußeren Joins zweier Auflistungen besteht darin, einen inneren Join mithilfe eines Group Joins auszuführen. (Eine Erläuterung dieses Vorgangs finden Sie unter Gewusst wie: Ausführen innerer Verknüpfungen (C#-Programmierhandbuch).) In diesem Beispiel ist die Liste der Person-Objekte über einen inneren Join mit der Liste der Pet-Objekte verknüpft, wobei die Person mit der Pet.Owner-Eigenschaft übereinstimmt.

Als Nächstes muss jedes Element der ersten (linken) Auflistung in den Ergebnissatz eingeschlossen werden, selbst wenn dieses Element keine Entsprechung in der rechten Auflistung hat. Dazu rufen Sie DefaultIfEmpty für jede Sequenz von übereinstimmenden Elementen aus dem Group Join auf. In diesem Beispiel wird DefaultIfEmpty für jede Sequenz mit übereinstimmenden Pet-Objekten aufgerufen. Es wird eine Auflistung zurückgegeben, die einen einzelnen Standardwert enthält, wenn die Sequenz mit übereinstimmenden Pet-Objekten für jedes beliebige Person-Objekt leer ist, somit wird sichergestellt, dass jedes Person-Objekt in der Ergebnisauflistung dargestellt wird.

Tipp

Der Standardwert für einen Referenztyp ist null; in diesem Beispiel wird daher nach einem NULL-Verweis gesucht, bevor auf jedes Element in jeder Pet-Auflistung zugegriffen wird.

        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:

Kompilieren des Codes

  • Erstellen Sie ein neues Konsolenanwendungsprojekt in Visual Studio.

  • Fügen Sie einen Verweis auf System.Core.dll hinzu, wenn er noch nicht existiert.

  • Schließen Sie den System.Linq-Namespace ein.

  • Kopieren Sie den Code aus dem Beispiel, und fügen Sie ihn in die program.cs-Datei unter der Main-Methode ein. Fügen Sie der Main-Methode eine Codezeile hinzu, um die eingefügte Methode aufzurufen.

  • Führen Sie das Programm aus.

Siehe auch

Aufgaben

Gewusst wie: Ausführen innerer Verknüpfungen (C#-Programmierhandbuch)

Gewusst wie: Ausführen von Gruppenverknüpfungen (C#-Programmierhandbuch)

Referenz

Join

GroupJoin

Anonyme Typen (C#-Programmierhandbuch)

Konzepte

Verknüpfungsvorgänge

Anonyme Typen (Visual Basic)