Практическое руководство. Выполнение левых внешних соединений (Руководство по программированию на C#)
Левое внешнее соединение является соединением, при котором каждый элемент первой коллекции возвращается независимо от наличия взаимосвязанных элементов во второй коллекции.LINQ можно использовать для левого внешнего соединения, вызвав метод DefaultIfEmpty на основании результатов соединения группы.
Пример
В следующем примере показано, как использовать метод DefaultIfEmpty применительно к результатам группового соединения для выполнения левого внешнего соединения.
Первым шагом выполнения левого внешнего соединения двух коллекций является выполнение внутреннего соединения с помощью группового соединения.(Описание этой процедуры см. в разделе Практическое руководство. Выполнение внутренних соединений (Руководство по программированию на C#).) В этом примере список объектов Person внутренн- соединение в список объектов Pet, основанных на объекте Person, соответствующее Pet.Owner.
Вторым этапом является включение каждого элемента первой (левой) коллекции в результирующий сбор, даже если какой-то из элементов не имеет совпадений в правой коллекции.Эта процедура выполняется путем вызова метода DefaultIfEmpty для каждой последовательности совпадающих элементов из группового соединения.В этом примере DefaultIfEmpty вызван на каждой последовательности соответствующие объекты 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#)