Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_ПАРАДИГМИ ПРОГРАМУВАННЯ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.32 Mб
Скачать

12.3.5. З'єднання

Операції з'єднання створюють зв'язки між послідовностями, неявно змодельованими в джерелах даних. Наприклад, можна виконати з'єднання для пошуку всіх замовників в Москві, що замовили продукти у постачальників в Парижі. У LINQ пропозиція join завжди працює з колекціями об'єктів, а не безпосередньо з таблицями бази даних. У LINQ немає необхідності використовувати join так часто, як в SQL, оскільки зовнішні ключі в LINQ представлені в об'єктній моделі властивостями, що містять колекцію елементів. Наприклад, об'єкт Customer містить колекцію об'єктів Order. Замість виконання з'єднання, доступ до замовлень можна отримати за допомогою точкової нотації:

from order in Customer.Orders...

12.3.6. Вибір (Проектування)

Пропозиція select створює результати запиту і задає форму або тип кожного елементу, що повертається. Наприклад, можна вказати, чи будуть результати складатися з повних об'єктів Customer, лише з одного члена, підмножини членів або деяких абсолютно інших типів, на основі обчислень або створення нових об'єктів. Коли пропозиція select створює що-небудь відмінне від копії вихідного елементу, операція називається проекцією. Використання проекцій для перетворення даних є потужною можливістю виразів запитів LINQ.

12.4. Перетворення даних з linq

LINQ використовується не лише для відбіру даних. Це також потужний засіб для перетворення даних. За допомогою запиту LINQ можна використовувати вихідну послідовність як вхідні дані і змінювати її різними способами для створення нової вихідної послідовності. Можна змінити саму послідовність, не змінюючи елементів, за допомогою сортування і угрупування. Але, можливо, найбільш потужною функцією запитів LINQ є можливість створення нових типів. Це виконується в пропозиції select. Наприклад, можна виконати наступні завдання:

  • Об'єднати декілька вхідних послідовностей в одну вихідну послідовність, яка має новий тип.

  • Створити вихідні послідовності, елементи яких складаються лише з одного або декількох властивостей кожного елементу у вихідній послідовності.

  • Створити вихідні послідовності, елементи яких складаються з результатів операцій, що виконуються над вихідними даними.

  • Створити вихідні послідовності в іншому форматі. Наприклад, можна перетворити дані з рядків SQL або текстових файлів в XML.

Це лише декілька прикладів. Зрозуміло, ці перетворення можуть об'єднуватися різними способами в одному запиті. Більш того, вихідні послідовності одного запиту можуть використовуватися як вхідні послідовності для нового запиту.

12.4.1. З'єднання декількох вхідних послідовностей в одну вихідну

Запит LINQ можна використовувати для створення вихідної послідовності, що містить елементи з декількох вхідних послідовностей. У наступному прикладі показано об'єднання двох структур даних, що знаходяться в пам'яті, але ті саміпринципи можуть застосовуватися для з'єднання даних з джерел XML, SQL або DataSet. Передбачимо, що існують два наступні типи класів:

class Student

{

public string First { get; set; }

public string Last {get; set;}

public int ID { get; set; }

public string City { get; set; }

public List<int> Scores;

}

class Teacher

{

public string First { get; set; }

public string Last { get; set; }

public int ID { get; set; }

public string City { get; set; }

}

У наступному прикладі показаний запит:

class DataTransformations

{

static void Main()

{

// Створення першого джерела даних

List<Student> students = new List<Student>()

{

new Student {First="Светлана"

Last="Омельченко"

ID=111

City="Москва"

Scores= new List<int> {5, 4, 5, 3}},

new Student {First="Кристина"

Last="Лаврова"

ID=112

City="Тюмень"

Scores= new List<int> {5, 3, 3, 4}},

new Student {First="Иван"

Last="Моргунов"

ID=113

City="Новосибирск"

Scores= new List<int> {5, 5, 5, 4}},

};

// Створення другого джерела даних

List<Teacher> teachers = new List<Teacher>()

{

new Teacher {First="Анна", Last="Виннер", ID=945, City = "Москва"}

new Teacher {First="Алексей", Last="Иващенко", ID=956, City = "Санкт-Петербург"}

new Teacher {First="Михаил", Last="Антонов", ID=972, City = "Смоленськ"}

};

// Створення запиту

var peopleInMoscow = (from student in students

where student.City == "Москва"

select student.Last)

Concat(from teacher in teachers

where teacher.City == "Москва"

select teacher.Last);

Console.WriteLine("Наступні студенти і вчителі живуть в Москві:");

// Виконання запиту

foreach (var person in peopleInMoscow)

{

Console.WriteLine(person);

}

Console.WriteLine("Натискуйте будь-яку кнопку для виходу!");

Console.ReadKey();

}

}

/* На виході буде отримано:

Наступні студенти і вчителі живуть в Москві:

Омельченко

Віннер

*/

Повний текст програми

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Link1

{

class Student

{

public string First { get; set; }

public string Last { get; set; }

public int ID { get; set; }

public string City { get; set; }

public List<int> Scores;

}

class Teacher

{

public string First { get; set; }

public string Last { get; set; }

public int ID { get; set; }

public string City { get; set; }

}

class Program

{

static void Main(string[] args)

{

// Створення першого джерела даних

List<Student> students = new List<Student>()

{

new Student {First="Светлана"

Last="Омельченко"

ID=111

City="Москва"

Scores= new List<int> {5, 4, 5, 3}},

new Student {First="Кристина"

Last="Лаврова"

ID=112

City="Тюмень"

Scores= new List<int> {5, 3, 3, 4}},

new Student {First="Иван"

Last="Моргунов"

ID=113

City="Новосибирск"

Scores= new List<int> {5, 5, 5, 4}},

};

// Створення другого джерела даних

List<Teacher> teachers = new List<Teacher>()

{

new Teacher {First="Анна", Last="Виннер", ID=945, City = "Москва"}

new Teacher {First="Алексей", Last="Иващенко", ID=956, City = "Санкт-Петербург"}

new Teacher {First="Михаил", Last="Антонов", ID=972, City = "Смоленськ"}

};

// Створення запиту

var peopleInMoscow = (from student in students

where student.City == "Москва"

select student.Last)

.Concat(from teacher in teachers

where teacher.City == "Москва"

select teacher.Last);

Console.WriteLine("Наступні студенти і вчителі живуть в Москві:");

// Виконання запиту

foreach (var person in peopleInMoscow)

{

Console.WriteLine(person);

}

Console.WriteLine("Натискуйте будь-яку кнопку для виходу!");

Console.ReadKey();

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]