Лямбда функції і замикання наближають php по функціональності до інших сучасних мов. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лямбда функції і замикання наближають php по функціональності до інших сучасних мов.



 


Лекція 12. Мова LINQ

План

1. Основи мови LINQ

LINQ: узагальнення і інтерфейси

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

Перетворення даних з LINQ

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

6. Синтаксис запиту або синтаксис методу

 

Основи мови LINQ

Language Integrated Query (LINQ) – проект Microsoft по додаванню синтаксису мови запитів, що нагадує SQL, в мови програмування платформи.NET Framework. LINQ випущений разом з Visual Studio 2008 в кінці листопада 2007 року.

LINQ (Language-Integrated Query) є набором функцій Visual Studio 2008, що розширюють потужні можливості запитів в синтаксисі мови C# і Visual Basic. LINQ представляє стандартні шаблони для створення запитів і оновлення даних; технологія може бути розширена для підтримки потенційно будь-якого типа сховища даних. Visual Studio 2008 включає різних постачальників LINQ, що дозволяють використовувати LINQ з колекціями платформи.NET Framework, базами даних SQL Server, наборами даних ADO.NET і XML-документами.

LINQ є набором розширень мови, що підтримує формування запитів даних способом, безпечним по типах. Запрошувані дані можуть бути представлені у формі XML (запити LINQ до XML), баз даних (ADO.NET з підтримкою LINQ, куди входять LINQ до SQL, LINQ до наборів даних і LINQ до екземплярів), об'єктів (LINQ до об'єктів) і так далі Архітектура LINQ показана на рис. 12.1.

Принцип LINQ полягає в тому, що всі елементи мови повинні виконувати одну і ту ж роботу незалежно від джерела даних. Проте, не дивлячись на те, що синтаксис працює зі всіма типами джерел даних, постачальник запиту, що пов'язує дані з самим джерелом даних, може реалізувати цю поведінку самими різними способами.

 

Рис. 12.1. Архітектура LINQ

 

Розглянемо приклад інтегрованого запиту:

var contacts = from c in customers where c.City == "Москва" select new { c.Name, c.Phone };

 

Тут з деякого джерела даних customers вибираються імена і телефони клієнтів, що проживають в місті Москві. Запит дуже схожий на мову SQL, проте використовує синтаксис, що строго типізується.

Цей же запит можна записати і в іншому вигляді – використовуючи лямбда-вирази і методи розширення (рис.12. 2). Саме до такого вигляду приведе код, наведений в прикладі вище, компілятор.


Рис. 12.2. Два способи написання запиту LINQ на мові C# 3.0

LINQ пропонує узгоджену модель для роботи з даними в різних видах джерел даних і в різних форматах. У запиті LINQ робота завжди здійснюється з об'єктами. Для запитів і перетворень даних в XML-документах, базах даних SQL, наборах даних ADO.NET, колекціях.NET і будь-яких інших форматах, для яких доступний постачальник LINQ, використовуються однакові базові шаблони кодування.

Всі операції запиту LINQ складаються з трьох різних дій.

1. визначення джерела даних;

2. створення запиту;

3. виконання запиту.

У наступному прикладі показано вираз цих трьох частин операції запиту у вихідному коді. У прикладі як джерело даних для зручності використовується масив цілих чисел; проте, ті ж принципи застосовні і до інших джерел даних.

 

class IntroToLINQ{ static void Main() { // 1. Визначення джерела даних int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. Створення запиту // numQuery – це IEnumerable<int> var numQuery = from num in numbers where (num % 2) == 0 select num; // 3. Виконання запиту foreach (int num in numQuery) { Console.Write("{0,1} ", num); } }}

Результатом виконання запиту буде вивід на консоль лише парних чисел.

На рис. 12.3 показана завершена операція запиту. У LINQ виконання запиту відрізняється від самого запиту; іншими словами, створення змінної запиту само по собі не пов'язане із отриманням даних.


Рис.12.3. Операція запиту в LINQ

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

У попередньому прикладі джерелом даних був масив, тому він неявно підтримує універсальний інтерфейс IEnumerable<(Of <(T>)>). Це означає, що до нього можна виконувати запити з LINQ. Запит виконується в операторі foreach, і оператору foreach потрібний інтерфейс IEnumerable або IEnumerable<(Of <(T>)>). Типи, які підтримують IEnumerable<(Of <(T>)>) або похідні інтерфейси, такі як універсальний інтерфейс IQueryable<(Of <(T>)>), називаються запрошуваними типами.

Інтерфейс це повністю абстрактний клас, всі методи якого абстрактні (не містять реалізації).

 

Якщо клас можна розглядати як деякий контейнер об'єктів перечислення, то для того, щоб клас міг повертати ці об'єкти в циклі for each, клас має бути спадкоємцем інтерфейсу IEnumerable або мати в своєму складі ітератори - методи, які повертають результат типа IEnumerable.

Для запрошуваного типа, як джерело даних LINQ, не потрібні зміни або спеціальна обробка. Якщо джерело даних ще не знаходиться в пам'яті у вигляді запрошуваного типа, постачальник LINQ повинен представити його як такий. Наприклад, LINQ to XML завантажує XML-документ в запрошуваний тип XElement:

// Створення джерела даних з XML-документа, використовуючи System.Xml.LinqXElement contacts = XElement.Load(@"c:\myContactList.xml");

Використовуючи LINQ to SQL, спочатку вручну або за допомогою конструктора об'єктів створюється об'єктно-реляційне зіставлення в режимі розробки. Потім можна написати запити до об'єктів, а під час виконання LINQ to SQL здійснюватиме взаємодію з базою даних. У наступному прикладі Customer представляє певну таблицю в базі даних, а Table<Customer> підтримує універсальний інтерфейс IQueryable<(Of <(T>)>), похідний від IEnumerable<(Of <(T>)>):

// Створення джерела даних з бази даних SQL Server, використовуючи System.Data.LinqDataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

Запит

Запит вказує, яку інформацію потрібно витягувати з джерела або джерел даних. При необхідності, запит також вказує спосіб сортування, групування і формування цих відомостей перед поверненням. Запит зберігається в змінній запиту і ініціалізується виразом запиту. Аби спростити написання запитів, в C# з'явився новий синтаксис запиту.

Запит з попереднього прикладу повертає всі парні числа з масиву цілих чисел. Вираз запиту містить три ключові слова: from, where і select. Слово from вказує джерело даних, where застосовує фільтр, а select вказує тип результату. Важливо, що в LINQ сама змінна запиту не виконує дій і не повертає жодних даних. Вона просто зберігає відомості, необхідні для надання результатів при подальшому виконанні запиту.

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

Виконання запиту розділяють на відкладене і примусове (негайне).

Як вже говорилося раніше, сама змінна запиту лише зберігає команди запиту. Фактичне виконання запиту відкладається до виконання ітерації змінної запиту в операторі foreach. Цю концепцію називають відкладеним виконанням, вона показана в наступному прикладі:

 

// Виконання запиту foreach (int num in numQuery){ Console.Write("{0,1} ", num);}

Оператор foreach є також місцем, де витягуються результати запиту. Наприклад, в попередньому запиті змінна ітерації num містить кожне (по черзі) значення в послідовності, що повертається.

Запити, що виконують статистичні функції над діапазоном вихідних елементів, повинні спочатку виконати ітерацію цих елементів. Прикладами таких запитів є Count, Мах, Average і First. Вони виконуються без явного оператора foreach, оскільки сам запит повинен використовувати foreach для повернення результату. Зверніть увагу, що такий тип запитів повертає одне значення, а не колекцію IEnumerable. Наступний запит повертає кількість парних чисел у вихідному масиві:

 

var evenNumQuery = from num in numberswhere (num % 2) == 0select num;int evenNumCount = evenNumQuery.Count();

 

Аби примусово викликати негайне виконання будь-якого запиту і кешувати його результати, можна викликати метод ToList<(Of <(TSource>)>) або ToArray<(Of <(TSource>)>):

 

List<int> numQuery2 = (from num in numbers where (num % 2) == 0 select num).ToList();// або так:// numQuery3 – це було int[]var numQuery3 = (from num in numbers where (num % 2) == 0 select num.ToArray();

 

Можна також примусово виконати запит, помістивши цикл foreach відразу після вираження запиту. Проте виклик ToList або ToArray також кэширует всі дані в одній колекції об'єктів.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 227; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.185.207 (0.008 с.)