Практическое руководство. Выполнение левых внешних соединений (Руководство по программированию на 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#)
Ссылки
Анонимные типы (Руководство по программированию в C#)