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

12.3. Основні операції запиту

12.3.1. Визначення джерела даних

В першу чергу в запиті LINQ потрібно вказати джерело даних. У C#, як і в більшості мов програмування, змінна має бути оголошена до її використання. У запиті LINQ першим йде слово from для вказівки джерела даних (customers) і змінна діапазону (cust):

//queryAllCustomers – це IEnumerable<Customer>

var queryAllCustomers = from cust in customers

select cust;

Змінна діапазону схожа із змінною ітерації в циклі foreach за винятком того, що у виразі запиту не відбувається фактичної ітерації. При виконанні запиту змінна діапазону використовуватиметься як посилання на кожен подальший елемент в customers. Оскільки компілятор може визначити тип cust, немає необхідності вказувати його в явному вигляді. Додаткові змінні діапазону можуть бути введені словом let.

12.3.2. Фільтрація

Можливо, найбільш поширеною операцією запиту є використання фільтру у вигляді логічного виразу. Результат створюється за допомогою ключового слова where. Фільтр фактично вказує елементи для виключення з вихідної послідовності. У наступному прикладі повертаються лише customers, що знаходяться в Москві:

var queryMoscowCustomers = from cust in customers

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

select cust;

Для використання потрібного числа виразів фільтру в where можна використовувати знайомі логічні оператори C# AND і OR. Наприклад, для отримання лише замовників з Москви і з ім'ям Іван слід написати наступний код:

where cust.City=="Москва" && cust.Name == "Іван"

Для отримання замовників з Москви або Смоленську слід написати наступний код:

where cust.City == "Москва" || cust.City == "Смоленськ"

12.3.3. Впорядкування

Часто доцільно відсортувати повернені дані. Пропозиція orderby сортує елементи послідовності залежно від компаратора за умовчанням для сортованого типа. Наприклад, наступний запит може бути розширений для сортування результатів на основі властивості Name. Оскільки Name є рядком, порівняння за умовчанням виконується в алфавітному порядку від А до Я:

var queryMoscowCustomers3 =

from cust in customers

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

orderby cust.Name ascending

select cust;

Для впорядкування результатів в зворотному порядку від Я до А використовується пропозиція orderby.descending.

12.3.4. Угрупування

Пропозиція group дозволяє групувати результати на основі вказаного ключа. Наприклад, можна вказати, що результати мають бути згруповані по City так, щоб всі замовники з Москви або Смоленську виявилися в окремих групах. В цьому випадку ключем є cust.City.

Примітка. Для демонстрації даного принципу в наступних прикладах використовуються явні типи. Також можна використовувати неявну типізацію для custQuery, group і customer, дозволяючи компілятору визначити точний тип:

// queryCustomersByCity – це IEnumerable<IGrouping<string, Customer>>

var queryCustomersByCity =

from cust in customers

group cust by cust.City;

// customerGroup – це IGrouping<string, Customer>

foreach (var customerGroup in queryCustomersByCity)

{

Console.WriteLine(customerGroup.Key);

foreach (Customer customer in customerGroup)

{

Console.WriteLine(" {0}", customer.Name);

}

}

Коли запит завершується пропозицією group, результати представляються у вигляді списку із списків. Кожен елемент в списку є об'єктом, що має член Кеу і список елементів, згрупованих по цьому ключу. При ітерації запиту, що створює послідовність груп, необхідно використовувати вкладений цикл foreach. Зовнішній цикл виконує ітерацію кожної групи, а внутрішній цикл – ітерацію членів кожної групи.

Якщо необхідно посилатися на результати операції угрупування, можна використовувати ключове слово into для створення ідентифікатора, який можна буде запитувати. Наступний запит повертає лише ті групи, які містять більше двох замовників:

// custQuery – це IEnumerable<IGrouping<string, Customer>>

var custQuery =

from cust in customers

group cust by cust.City into custGroup

where custGroup.Count() > 2

orderby custGroup.Key

select custGroup;

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