10Lektsia_Linq.ppt
- Количество слайдов: 13
LINQ Language Integrated Query Мова інтегрованих запитів
Що таке LINQ ? Ø На конференції Microsoft Professional Developers Conference (PDC) 2005, Андерс Хейзберг і його команда представила новий підхід - Мову Інтегрованих Запитів (Language Integrated Query(LINQ)), який уніфікує шлях отримання даних в. NET. Ø Комбінування об’єктно-орієнтованої і реляційної технологій у одному підході наз. Моделлю об’єктнореляційного відображення. Ø LINQ дозволяє отримувати дані з будь-яких об’єктів, що реалізують інтерфейс IEnumerable
using System. Linq; string[] greetings={"hello world", "hello LINQ", "hello Apress”}; var items = from s in greetings where s. Ends. With("LINQ") select s; foreach (var item in items) Console. Write. Line(item); hello LINQ
using System. Linq using System. Data. Linq Northwind db = new Northwind(@"Data Source=. SQLEXPRESS; Initial Catalog=Northwind; Integrated Security=SSPI; "); var custs = from c in db. Customers where c. City == "Rio de Janeiro" select c; foreach (var cust in custs) Console. Write. Line("{0}", cust. Company. Name); Hanari Carnes Que Delicia Ricardo Adocicanos
The LINQ Project C# VB Others… . NET Language Integrated Query Standard Query Operators DLinq (ADO. NET) XLinq (System. Xml)
LINQ Project Ø Мови, що забезпечують природню підтримку для LINQ: C# 3. 0 і Visual Basic 9. 0. Ø Основні частини проекту LINQ: v LINQ до об’єктів ( Objects) - API, що забезпечує методи, які представляють множину операторів стандартних запитів (standard query operators (SQO) ) для отримання даних з будь-яких типів об’єктів, які реалізують інтерфейс IEnumerable
Нововведення мови С# 3. 0 • Лямбда-вирази • Розширення методів c => c. Name static void Dump(this object o); • Виведення типу локальної змінної • Ініціалізація об’єктів • Анонімні типи • Вирази-запити • Дерева виразів var x = 5; new Point { x = 1, y = 2 } new { c. Name, c. Phone } from … where … select Expression
Лямбда-вирази • Лямбда-вирази спрощують програмування делегатів і анонімних методів. Вони замінюють функції, які можна передавати як аргументи в методи (напр. предикати). • Розділений комами список параметрів, за яким слідує лямбда-операція, а за нею – вираз або блок операторів. • Тип і кількість параметрів та тип return_expr повинен відповідати прототипу делегата (par 1, par 2, …, par. N) => return_expr (par 1, par 2, …, par. N) => { operator 1; operator 2; … operator. N; return (return_expr); } // Приклад лямбда-виразу для // delegate bool fun(int x, int y); (x, y) => { if(x>y) return (x); else return(y); }
Ініціалізація об’єктів. Ø Ініціалізація об’єктів здійснюється як і при ініціалізації масиву без виклику конструкторів чи встановленя властивостей класу. Ø Створюючи такий об’єкт, компілятор спочатку викликає конструктор за замовчуванням для даного класу, а далі проводить ініціалізацію вказаних полів. Непроініціалізовані поля приймають значення за замовчуванням для їх типів даних //ініціалізація об’єкту типу Point p 1=new Point{ x=1, y=4}; Ø Лише для тих колекцій, що реалізують інтерфейс Сollections. Generic. ICollection
Виведення типу локальної змінної Ø Виведення типу змінної здійснюється на основі типу даних, яким змінна буде проініціалізована (на етапі компіляції) Ø Тому виведення типу можливе лише при умові одночасної ініціалізації змінної var i = 5; //еквівалентно int i = 5; var s = “ring"; //еквівалентно string s = “ring"; var p; // error Ø Виведення типу змінної є особливо корисним для результатів складних запитів, оскільки це виключає необхідність визначати тип для кожного результату Ø Неявно типізована локальна змінна не може бути використана як параметр методу
Анонімні типи var person=new{First. Name=“Ira”, Last. Name=“Ratiz”}; Console. Write. Line(person. First. Name+” “+person. Last. Name); Ø Анонімний тип не має назви і генерується компілятором на основі ініціалізації створюваного екземпляру об’єкта internal class ? ? ? { private string _first. Name; private string _last. Name; public string First. Name { get { return _first. Name; } set { first. Name = value; } } public string Last. Name { get { return _last. Name; } set { last. Name = value; } } }
Розширення методів Ø Розширення методів поширює існуючі. NET типи новими методами. Ø Наприклад, можна поширити тип string новим методом , який замінює кожен пропуск в рядку на знак підкреслення. public static string Space. To. Underscore(this string source) {. . } Ø this, записаний перед першим параметром методу, вказує компілятору на тип, який ми хочемо розширити. Ø Метод і його клас повинні бути статичними. ØМетод Space. To. Underscore() надалі можна використовувати як і інші методи класу string. Ø При умові існування однойменного розширеного і власного методу, перевага віддається власному. Не можна розширювати властивості, події та оператори ØОператори стандартних запитів (where, select) розширюють інтерфейс IEnumerable
static class Ex_str { public static string Space. To. Underscore(this string source) { //…………… } }; class Program { static void Main(string[] args) { string ss 1 = "Like static method"; ss 1=Ex_str. Space. To. Underscore(ss 1); Console. Write. Line(ss 1); string ss 2 = "Like instance method"; ss 2=ss 2. Space. To. Underscore(); Console. Write. Line(ss 2); } }