Проект Linq (C# 3.0, VB 10.0) – будущее языков программирования Title of the Presentation Дмитрий Никонов Program Manager Microsoft
Содержание Проблема: Данные!=Объекты Проблема: Данные!=Объекты Расширения языков программирования Расширения языков программирования Новые элементы языка Новые элементы языка Операторы запросов в языке Операторы запросов в языке Работа с реляционными данными при помощи DLInQ Работа с реляционными данными при помощи DLInQ Работа с XML при помощи ХLInQ Работа с XML при помощи ХLInQ
Стандартныеоператорызапросов Об Об ъекты DLinq (ADO.NET) XLinq(System.Xml) XML.NET Language Integrated Query C#VB Другие языки… SQL
Новые элементы языка Неявно описанные переменные Неявно описанные переменные Методы расширения Методы расширения Lambda-выражения Lambda-выражения Инициализаторы объектов Инициализаторы объектов Анонимные типы данных Анонимные типы данных Операторы запросов Операторы запросов 100% обратная совместимость 100% обратная совместимость var x = 5; static void Dump(this object o); c => c.Name new Point { x = 1, y = 2 } new { c.Name, c.Phone } from … where … select
Стандартные Операторы Запросов Ограничение s.Where(…) Project s.Select(…), s.SelectMany(…) Сортировка s.OrderBy(…).ThenBy(…) … Группировка s.GroupBy(…) Quantify s.Any(…), s.All(…) Разделение s.TakeFirst(…), s.SkipFirst(…) Выбор подмножества (Set) s.Distinct(), s.Union(…), s.Intersect(…), s.Except(…) Выделение элемента (Singleton) s.Element(…), s.ElementAt(…) Аггрегация s.Count(), s.Sum(), s.Min(), s.Max(), s.Average() Конвертация s.ToArray(), s.ToList(), s.ToDictionary(…) Приведение типа (cast) s.OfType ()
Отсроченное исполнение запросов Customer[] custs = SampleData.GetCustomers(); custsPhoneNameID var query = from c in custs where c.City == "London" select c.Name; var query = custs.Where(c => c.City == "London").Select(c => c.Name); Select c => c.Name string[] names = query.ToArray(); names c => c.City == "London" Where
DLInQ для реляционных данных SqlConnection c = new SqlConnection(…); c.Open(); SqlCommand cmd = new c.Name, c.Name, c.Phone FROM Customers c FROM Customers c WHERE c.City WHERE c.City = "London"; DataReader dr = c.Execute(cmd); while (dr.Read()) { string name = r.GetString(0); string name = r.GetString(0); string phone = r.GetString(1); string phone = r.GetString(1); DateTime date = r.GetDateTime(2); DateTime date = r.GetDateTime(2);}r.Close(); Доступ к данным сегодня: Запросы в кавычках Слабосвязанные параметры (loosely-bound) Слаботипизированные результаты (Loosely typed result sets) Отсутствие проверок во время компиляции (No compile time checks)
public class Customer { … } public class Northwind: DataContext { public Table Customers; public Table Customers; …} Northwind db = new Northwind(…); var contacts = from c in db.Customers from c in db.Customers where c.City == "London" where c.City == "London" select new { c.Name, c.Phone }; select new { c.Name, c.Phone }; DLInQ для реляционных данных Доступ к данным с DLinq Классы описывают данные Строготипизированное соединение с БД (strongly typed connection) Встроенный язык запросов Строготипизированные результаты (strongly typed) Таблицы – как коллекции
Встроенный в язык доступ к данным Встроенный в язык доступ к данным Проецирование таблиц и записей в классы и объекты Проецирование таблиц и записей в классы и объекты Построен на ADO.NET и.NET транзакциях Построен на ADO.NET и.NET транзакциях Отображение - Mapping Отображение - Mapping Декларативное (Encoded in attributes) Декларативное (Encoded in attributes) Авто-генерация или генерация вручную Авто-генерация или генерация вручную ОR-М (Relationships map to properties) ОR-М (Relationships map to properties) Сохранение Состояния (Persistence) Сохранение Состояния (Persistence) Автоматическое отслеживание изменений Automatic change tracking Автоматическое отслеживание изменений Automatic change tracking Модификации через SQL или хранимые процедуры Модификации через SQL или хранимые процедуры DLInQ для реляционных данных
демо - DLInQ
XLInQ для данных в XML XmlDocument doc = new XmlDocument(); XmlElement contacts = doc.CreateElement("contacts"); foreach (Customer c in customers) if (c.Country == Russia") { if (c.Country == Russia") { XmlElement e = doc.CreateElement("contact"); XmlElement e = doc.CreateElement("contact"); XmlElement name = doc.CreateElement("name"); XmlElement name = doc.CreateElement("name"); name.InnerText = c.CompanyName; name.InnerText = c.CompanyName; e.AppendChild(name); e.AppendChild(name); XmlElement phone = doc.CreateElement("phone"); XmlElement phone = doc.CreateElement("phone"); phone.InnerText = c.Phone; phone.InnerText = c.Phone; e.AppendChild(phone); e.AppendChild(phone); contacts.AppendChild(e); contacts.AppendChild(e); }doc.AppendChild(contacts); Работа с XML сегодня: Great Lakes Food Great Lakes Food (503) (503) … Императивная (Imperative) модель Ориентация на работу с документами Нет встроенного языка запросов Потребляет много памяти
XLInQ для данных в XML XElement contacts = new XElement("contacts", from c in customers from c in customers where c.Country == Russia" where c.Country == Russia" select new XElement("contact", select new XElement("contact", new XElement("name", c.CompanyName), new XElement("name", c.CompanyName), new XElement("phone", c.Phone) new XElement("phone", c.Phone) )); Работа с XML при помощи XLinq Декларативная (declarative) модель Ориентация на работу с элементами Встроенные запросы Быстрее, требует меньше памяти
XLInQ для данных в XML LInQ для XML LInQ для XML Мощь и эффективность XPath / XQuery, Мощь и эффективность XPath / XQuery, но используя языки C# or VB Использует лучшее из DOM Использует лучшее из DOM Ориентация на элементы, а не документы Ориентация на элементы, а не документы Симметрия в API между элементами и аттрибутами Симметрия в API между элементами и аттрибутами Functional construction Functional construction Текстовые ноды – просто строки (strings) Текстовые ноды – просто строки (strings) Упрощенная поддержка пространств имен XML Упрощенная поддержка пространств имен XML Быстрее, потребляет меньше ресурсов Быстрее, потребляет меньше ресурсов
XLInQ для данных в XML LInQ для XML LInQ для XML Мощь и эффективность XPath / XQuery, Мощь и эффективность XPath / XQuery, но используя языки C# or VB Использует лучшее из DOM Использует лучшее из DOM Ориентация на элементы, а не документы Ориентация на элементы, а не документы Идентичность/Симметрия в API между элементами и аттрибутами Идентичность/Симметрия в API между элементами и аттрибутами Текстовые узлы – просто строки (strings) Текстовые узлы – просто строки (strings) Упрощенная поддержка пространств имен XML Упрощенная поддержка пространств имен XML Быстрее, потребляет меньше ресурсов Быстрее, потребляет меньше ресурсов
Демо - XLInQ
Проект LINQ - Заключение Встроенный язык запросов для.NET Встроенный язык запросов для.NET Язык запросов внутри C# 3.0 и VB 9.0 Язык запросов внутри C# 3.0 и VB 9.0 Стандартные операторы запросов Стандартные операторы запросов SQL-подобные запросы для любых коллекций в.NET SQL-подобные запросы для любых коллекций в.NET DLinq DLinq Среда для работы с реляционными данными при помощи запросов Среда для работы с реляционными данными при помощи запросов XLinq XLinq Быстрый,мощный XML DOM с встроенным языком запросов Быстрый,мощный XML DOM с встроенным языком запросов
Проект LINQ - Заключение Преимущества LInQ Преимущества LInQ Общий способ доступа и построения запросов к данным любого типа Общий способ доступа и построения запросов к данным любого типа Проверка типов данных и IntelliSense для языка запросов Проверка типов данных и IntelliSense для языка запросов Мощь SQL и XQuery в C# и VB Мощь SQL и XQuery в C# и VB
Вопросы? (и ответы )
Ask the Expert В течение часа после доклада я буду присутствовать на стенде Спроси эксперта В течение часа после доклада я буду присутствовать на стенде Спроси эксперта
© 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.