Wykonywanie lewych sprzężeń zewnętrznychPerform left outer joins

Lewe sprzężenie zewnętrzne jest elementem sprzężenia, w której każdy element pierwsza kolekcja jest zwracana, niezależnie od tego, czy ma żadnych elementów skorelowane w drugiej kolekcji.A left outer join is a join in which each element of the first collection is returned, regardless of whether it has any correlated elements in the second collection. LINQ umożliwia wykonywanie lewe sprzężenie zewnętrzne, wywołując DefaultIfEmpty metody na wynikach sprzężenie grupy.You can use LINQ to perform a left outer join by calling the DefaultIfEmpty method on the results of a group join.

PrzykładExample

Poniższy przykład pokazuje sposób użycia DefaultIfEmpty metody na wynikach sprzężenie grupy do wykonania lewego sprzężenia zewnętrznego.The following example demonstrates how to use the DefaultIfEmpty method on the results of a group join to perform a left outer join.

Pierwszym krokiem podczas produkcji lewe sprzężenie zewnętrzne dwóch kolekcji jest wykonywanie sprzężenia wewnętrznego przy użyciu sprzężenie grupy.The first step in producing a left outer join of two collections is to perform an inner join by using a group join. (Zobacz wykonanie sprzężeń wewnętrznych objaśnienia dotyczące tego procesu.) W tym przykładzie lista Person obiektów jest wewnętrzny przyłączone do listy Pet na podstawie obiektów Person obiektu, który odpowiada Pet.Owner.(See Perform inner joins for an explanation of this process.) In this example, the list of Person objects is inner-joined to the list of Pet objects based on a Person object that matches Pet.Owner.

Drugim krokiem jest uwzględnienie każdego elementu pierwszej kolekcji (po lewej stronie) w zestawie, nawet jeśli ten element nie ma żadnych dopasowań w prawo kolekcji wyników.The second step is to include each element of the first (left) collection in the result set even if that element has no matches in the right collection. Jest to realizowane przez wywołanie metody DefaultIfEmpty na każdej sekwencji zgodnych elementów z sprzężenie grupy.This is accomplished by calling DefaultIfEmpty on each sequence of matching elements from the group join. W tym przykładzie DefaultIfEmpty jest wywoływana w każdej sekwencji zgodnych Pet obiektów.In this example, DefaultIfEmpty is called on each sequence of matching Pet objects. Metoda zwraca kolekcję, która zawiera pojedynczą, wartość domyślna, jeśli sekwencja zgodnych Pet obiektów jest pusta dla żadnego Person obiektu, zapewniając, że każdy Person obiekt jest reprezentowany w kolekcji wynik.The method returns a collection that contains a single, default value if the sequence of matching Pet objects is empty for any Person object, thereby ensuring that each Person object is represented in the result collection.

Uwaga

Wartość domyślna dla typu odwołania to null; w związku z tym, przykład sprawdza, czy odwołania zerowego przed uzyskaniem dostępu do każdego elementu Pet kolekcji.The default value for a reference type is null; therefore, the example checks for a null reference before accessing each element of each Pet collection.

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:

Zobacz takżeSee also