Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ-Лабораторная 4.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
182.96 Кб
Скачать

Пример внутреннего соединения, реализуемого с помощью группового соединения

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

В query1 выполняется групповое соединение списка объектов Person со списком объектов Pet на основании сопоставления объекта Person и свойства Pet.Owner. Групповое соединение создает коллекцию промежуточных групп, в которой каждая группа состоит из объекта Person и последовательности совпадающих объектов Pet.

При добавлении в запрос второго предложения from данная последовательность из последовательностей объединяется (или выравнивается) в одну более длинную последовательность. Тип элементов конечной последовательности задается предложением select.В этом примере тип является анонимным типом, состоящим из свойств Person.FirstName и Pet.Name каждой соответствующей пары.

Результат query1 аналогичен результирующему набору, полученному при использовании предложения join для выполнения внутреннего соединения без предложения into. Переменная query2 демонстрирует этот эквивалентный запрос.

C#

Копировать

classPerson

{

publicstringFirstName { get; set; }

publicstringLastName { get; set; }

}

class Pet

{

publicstring Name { get; set; }

public Person Owner { get; set; }

}

publicstaticvoidInnerGroupJoinExample()

{

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 query1 = from person in people

join pet in pets on person equalspet.Ownerintogj

fromsubpetingj

selectnew { OwnerName = person.FirstName, PetName = subpet.Name };

Console.WriteLine("Inner join using GroupJoin():");

foreach (var v in query1)

{

Console.WriteLine("{0} - {1}", v.OwnerName, v.PetName);

}

var query2 = from person in people

join pet in pets on person equalspet.Owner

selectnew { OwnerName = person.FirstName, PetName = pet.Name };

Console.WriteLine("\nThe equivalent operation using Join():");

foreach (var v in query2)

Console.WriteLine("{0} - {1}", v.OwnerName, v.PetName);

}

// This code produces the following output:

//

// Inner join using GroupJoin():

// Magnus - Daisy

// Terry - Barley

// Terry - Boots

// Terry - Blue Moon

// Charlotte - Whiskers

//

// The equivalent operation using Join():

// Magnus - Daisy

// Terry - Barley

// Terry - Boots

// Terry - BlueMoon

// Charlotte - Whiskers

42