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

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

Пример

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

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

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

Примечание

Значение по умолчанию для типа 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.Linq.

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

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

См. также

Задачи

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

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

Ссылки

Join

GroupJoin

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

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

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

Анонимные типы (Visual Basic)