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

12.4.4. Виконання операцій над вихідними елементами

Вихідна послідовність може не містити яких-небудь елементів або властивостей елементів з вихідної послідовності. Результатом може бути послідовність значень, що обчислюються з використанням вихідних елементів як вхідні аргументи. При виконанні наступного простого запиту виводиться послідовність рядків, значення яких розраховані на основі вихідної послідовності елементів типа double.

Примітка. Виклик методів у виразах запиту не підтримується, якщо запит буде перенесений в який-небудь інший домен. Наприклад, неможливо викликати звичайний метод C# в LINQ to SQL, оскільки в SQL Server для нього відсутній контекст. Проте, збережувані процедури можна зіставити методам і викликати останні:

class FormatQuery

{

static void Main()

{

// Джерело даних

double[] radii = { 1, 2, 3 };

// Запит

IEnumerable<string> query =

from rad in radii

select String.Format("Area = {0}", (rad * rad) * 3.14);

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

foreach (string s in query)

Console.WriteLine(s);

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

Console.ReadKey();

}

}

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

Area = 3.14

Area = 12.56

Area = 28.26

*/

12.5. Зв'язки типів в операціях запиту

Для ефективного написання запитів слід розуміти, як типи змінних зв'язані один з одним в повній операції запиту. Розуміння цих зв'язків полегшить засвоєння прикладів LINQ і прикладів коду в документації. Більш того, можна буде уявити, що відбувається у фоновому режимі при неявній типізації змінних за допомогою var.

Операції запитів LINQ строго типізуються в джерелі даних, в самому запиті і при виконанні запиту. Тип змінних в запиті має бути сумісний з типом елементів в джерелі даних і з типом змінної ітерації в операторі foreach. Строга типізація гарантує перехоплення помилок під час компіляції, коли їх можна буде виправити перш, ніж з ними зіткнуться користувачі.

12.5.1. Запити, що не виконують перетворення вихідних даних

На рис. 12.4. показана операція запиту LINQ to Objects, що не виконує перетворення даних. Джерело містить послідовність рядків, результат запиту також є послідовністю рядків.

INCLUDEPICTURE "http://www.intuit.ru/department/internet/mwebtech/10/08_04.gif" \* MERGEFORMATINET

Рис. 12.4. Операція запиту LINQ to Objects, що не виконує перетворення даних

Зв'язки типів в операціях запиту (LINQ)

  1. Аргумент типу джерела даних визначає тип змінної діапазону.

  2. Тип вибраного об'єкту визначає тип змінної запиту. Тут name є рядком. Отже, змінна запиту є IEnumerable<string>.

  3. Ітерація змінної запиту виконується в операторі foreach. Оскільки змінна запиту є послідовністю рядків, змінна ітерації також є рядком.

12.5.2. Запити, що виконують перетворення вихідних даних

На рис 12.5. показана операція запиту LINQ to SQL, що виконує просте перетворення даних. Як вхідні дані запит отримує послідовність об'єктів Customer і вибирає в результаті лише властивість Name. Оскільки Name є рядком, запит створює послідовність рядків як результат.

INCLUDEPICTURE "http://www.intuit.ru/department/internet/mwebtech/10/08_05.gif" \* MERGEFORMATINET

Рис. 12.5.  Операція запиту LINQ to Objects, що виконує просте перетворення даних

Зв'язки типів в операціях запиту (LINQ)

  1. Аргумент типу джерела даних визначає тип змінної діапазону.

  2. Оператор select повертає властивість Name замість цілого об'єкту Customer. Оскільки Name є рядком, аргумент типа custNameQuery є string, а не Customer.

  3. Оскільки custNameQuery є послідовністю рядків, змінна ітерації циклу foreach також має бути string.

На рис. 12.6 показано трохи складніше перетворення. Оператор select повертає анонімний тип, що захоплює лише двох членів вихідного об'єкту Customer.

INCLUDEPICTURE "http://www.intuit.ru/department/internet/mwebtech/10/08_06.gif" \* MERGEFORMATINET

Рис. 12.6.  Операція запиту LINQ to Objects, що виконує складне перетворення даних

Аргумент типу джерела даних завжди є типом змінної діапазону в запиті.

  1. Оскільки оператор select створює анонімний тип, змінна запиту має неявно типізуватися за допомогою var.

  2. Оскільки тип змінної запиту неявний, змінна ітерації в циклі foreach також має бути неявною.

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