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

Aktualisiert: November 2007

Eine linke äußere Verknüpfung ist eine Verknüpfung, in der 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 eine linke äußere Verknüpfung ausführen, indem Sie DefaultIfEmpty für die Ergebnisse einer Gruppenverknüpfung aufrufen.

Beispiel

Das folgende Beispiel veranschaulicht, wie die DefaultIfEmpty-Methode auf die Ergebnisse der Gruppenverknüpfung angewendet wird, um eine linke äußere Verknüpfung auszuführen.

Der erste Schritt beim Erstellen einer linken äußeren Verknüpfung zweier Auflistungen besteht darin, eine innere Verknüpfung mithilfe einer Gruppenverknüpfung 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 eine innere Verknüpfung 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 der Gruppenverknüpfung 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.

Hinweis:

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)

Konzepte

Verknüpfungsvorgänge

Anonyme Typen

Referenz

Join

GroupJoin

Anonyme Typen (C#-Programmierhandbuch)