Поделиться через


Практическое руководство. Выполнение левых внешних соединений (руководство по программированию на C#)

Обновлен: Ноябрь 2007

Левое внешнее соединение является соединением, при котором каждый элемент первой коллекции возвращается независимо от наличия взаимосвязанных элементов во второй коллекции. Можно использовать LINQ для выполнения левого внешнего соединения, вызвав метод DefaultIfEmpty для результатов группового соединения.

Пример

В следующем примере показано, как использовать метод DefaultIfEmpty применительно к результатам группового соединения для выполнения левого внешнего соединения.

Первым шагом выполнения левого внешнего соединения двух коллекций является выполнение внутреннего соединения с помощью группового соединения. (Описание этой процедуры см. в разделе Практическое руководство. Выполнение внутренних соединений (Руководство по программированию на C#).) В этом примере выполняется внутреннее соединение перечня объектов Person с перечнем объектов Pet на основе совпадения значения Pet.Owner с объектом Person.

Вторым этапом является включение каждого элемента первой (левой) коллекции в результирующий сбор, даже если какой-то из элементов не имеет совпадений в правой коллекции. Эта процедура выполняется путем вызова метода DefaultIfEmpty для каждой последовательности совпадающих элементов из группового соединения. В этом примере метод DefaultIfEmpty вызывается для каждой последовательности совпадающих объектов Pet. Результатом является коллекция, содержащая единое, установленное по умолчанию значение, если последовательность совпадающих объектов Pet является пустой для любого объекта Person, тем самым гарантируя, что в результирующей коллекции будет представлен каждый объект Person.

Bb397895.alert_note(ru-ru,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.Linq.

  • Скопируйте код из примера в файл program.cs ниже метода Main. Добавьте в метод Main строку кода для вызова вставленного метода.

  • Запустите программу.

См. также

Задачи

Практическое руководство. Выполнение внутренних соединений (Руководство по программированию на C#)

Практическое руководство. Выполнение групповых соединений (руководство по программированию на C#)

Основные понятия

Операции соединения

Анонимные типы

Ссылки

Join

GroupJoin

Анонимные типы (Руководство по программированию в C#)