- •Лабораторная работа 4. Язык linq Задание
- •Синтаксис запроса
- •Синтаксис метода
- •Смешанный синтаксис запроса и метода
- •Пример соединения с использованием простого ключа
- •Пример соединения с использованием составного ключа
- •Пример множественного соединения
- •Пример внутреннего соединения, реализуемого с помощью группового соединения
Пример соединения с использованием простого ключа
В
следующем примере создаются две
коллекции, содержащие объекты двух
определяемых пользователем типов Person
и Pet.
В C# при запросе используется предложение
join
для сопоставления объектов Person
с объектами Pet,
для которых Owner
является Person.Предложение
select
в языке C# определяет то, как будут
выглядеть результирующие объекты.В
этом примере результирующие объекты —
анонимные типы, состоящие из имени
владельца и клички питомца.
C#
Копировать
class Person
{
publicstringFirstName { get; set; }
publicstringLastName { get; set; }
}
class Pet
{
publicstring Name { get; set; }
public Person Owner { get; set; }
}
///<summary>
/// Simple inner join.
///</summary>
publicstaticvoidInnerJoinExample()
{
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" };
Person rui = new Person { FirstName = "Rui", LastName = "Raposo" };
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 = rui };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
// Create two lists.
List<Person> people = new List<Person>{ magnus, terry, charlotte, arlene, rui };
List<Pet> pets = new List<Pet>{ barley, boots, whiskers, bluemoon, daisy };
// Create a collection of person-pet pairs. Each element in the collection
// is an anonymous type containing both the person's name and their pet's name.
var query = from person in people
join pet in pets on person equalspet.Owner
selectnew { OwnerName = person.FirstName, PetName = pet.Name };
foreach (varownerAndPetin query)
{
Console.WriteLine("\"{0}\" is owned by {1}", ownerAndPet.PetName, ownerAndPet.OwnerName);
}
}
// This code produces the following output:
//
// "Daisy" is owned by Magnus
// "Barley" is owned by Terry
// "Boots" is owned by Terry
// "Whiskers" is owned by Charlotte
// "Blue Moon" is owned by Rui
Обратите
внимание, что объект Person,свойство
которого LastName
имеет значение "Huff", не отображается
среди результатов, так как не существует
объекта Pet,
свойство Pet.Owner
которого было бы равно свойству Person.
Пример соединения с использованием составного ключа
Вместо сопоставления элементов на основании всего лишь одного свойства можно использовать составной ключ для сопоставления элементов на основании нескольких свойств. Для этого укажите, чтобы функция выбора ключа каждой коллекции возвращала анонимный тип, состоящий из свойств, которые необходимо сравнить.Если задается метка свойства, необходимо указать одну и ту же метку во всех анонимных типах ключа.Свойства также должны располагаться в том же порядке.
В
следующем примере списки объектов
Employee
и Student
используются для определения того,
какие работники являются также студентами.
Оба этих типа обладают свойствами
FirstName
и LastName
типа String.Функция,
создающая ключи соединения из элементов
каждого списка, возвращает анонимный
тип, состоящий из свойств FirstName
и LastName
каждого элемента.Операция соединения
сравнивает данные составные ключи на
признак равенства и возвращает пары
объектов из обоих списков, у которых
совпадают имя и фамилия.
C#
Копировать
class Employee
{
publicstringFirstName { get; set; }
publicstringLastName { get; set; }
publicintEmployeeID { get; set; }
}
class Student
{
publicstringFirstName { get; set; }
publicstringLastName { get; set; }
publicintStudentID { get; set; }
}
///<summary>
///Performs a join operation using a composite key.
///</summary>
publicstaticvoidCompositeKeyJoinExample()
{
// Create a list of employees.
List<Employee> employees = new List<Employee> {
new Employee { FirstName = "Terry", LastName = "Adams", EmployeeID = 522459 },
new Employee { FirstName = "Charlotte", LastName = "Weiss", EmployeeID = 204467 },
new Employee { FirstName = "Magnus", LastName = "Hedland", EmployeeID = 866200 },
new Employee { FirstName = "Vernette", LastName = "Price", EmployeeID = 437139 } };
// Create a list of students.
List<Student> students = new List<Student> {
new Student { FirstName = "Vernette", LastName = "Price", StudentID = 9562 },
new Student { FirstName = "Terry", LastName = "Earls", StudentID = 9870 },
new Student { FirstName = "Terry", LastName = "Adams", StudentID = 9913 } };
// Join the two data sources based on a composite key consisting of first and last name,
// to determine which employees are also students.
IEnumerable<string> query = from employee in employees
join student in students
onnew { employee.FirstName, employee.LastName }
equalsnew { student.FirstName, student.LastName }
selectemployee.FirstName + " " + employee.LastName;
Console.WriteLine("The following people are both employees and students:");
foreach (string name in query)
Console.WriteLine(name);
}
// This code produces the following output:
//
// The following people are both employees and students:
// TerryAdams
// VernettePrice
