SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Power of LINQ
      Юрий Муленко
          Betgenius
LINQ
          Language
          Integrated
          Query
Механизм и синтаксис «языка»
запросов, интегрированный в
языки .NET платформы
Кто работает с данными ?
А что вы с ними делаете?

• Поиск = фильтрация
• Превращения = трансформация
  / композиция / декомпозиция
• Сортировка
• Анализ
• Навигация = переход по связям
  / traversing
А если нет разницы…

        99.9%
всех операций
производимых над данными
повторяются в каждом API
или задаче *
                    * из личного опыта
Вы ещѐ кипятите?

• LINQ призван решить проблему
  эффективного взаимодействия
  языка программы и источника
  данных
• impedance mismatch
User
Тогда мы идем к вам!
Бла-бла-бла
                   • Erik Mejer
                   • Haskell, Mondrian, X#, Cω, C
                     #, Visual Basic.
                   • LINQ, Volta, Rx
                   • Head of Cloud
                     Programmibility Team

                   • LINQ – 2007... ! (.NET 3.5)
• Out of the box – Linq2Objects, Linq2SQL, Linq2XML
LINQ

• Универсальный API для
  работы с данными
              =
    Языковые конструкции
     + Набор операторов
    + синтаксический сахар
Вывод типа - VAR
Анонимные типы
Методы расширения
Методы расширения
Методы расширения
Лямбды
Лямбды
Функции как параметры
Угадайте функцию
высшего порядка на
следующем слайде!

        ?
Map
• Взять последовательность
                  int[]
• Применить функцию к каждому
  элементу последовательности
           foreach… int.ToString()
• Вернуть набор результатов
             return string[]
Map
Map
Map умного программиста
Map опытного программиста
LINQ 2 Objects

• Набор расширений поверх
  IEnumerable

• 50+ методов и их перегрузок
  (overloads) на все случаи
  жизни
Select (Map)
Where (Filter)
Сортировка
Аггрегация
Join
И все, все, все
Select SelectMany Min Max Sum
Count Average Aggregate Cast
ToList Join Reverse GroupBy
Intersect Join Where First Last Any
Except     OrderBy    Skip     Take
SkipWhile FirstOrDefault Single
Union Zip Contains Distinct
Empty Repeat
Альтернативный синтаксис
Сахарку ?




Поддерживаются «вложенные» запросы и операторы:
select, where, orderby ascending/descending,
group … by ... into ...
join on … equals …
let
Контрольный let в голову
LINQ2Anything
• А почему только коллекции?
Нельзя ли все эти Where - ы и лямбды
     u => u.Sex = ‘F’
выполнить на другом источнике данных?

• LINQ2Objects =
     IEnumerable extensions+ Func ’ s
• LINQ2Anything =
     IQueryable extensions + Expressions
Те же методы
Select SelectMany Min Max Sum
Count Average Aggregate Cast
ToList Join Reverse GroupBy
Intersect Join Where First Last Any
Except     OrderBy    Skip     Take
SkipWhile FirstOrDefault Single
Union Zip Contains Distinct
Empty Repeat
LINQ2Anything
• LINQ2Anything =
     IQueryable extenstions + Expressions

• Expressions = код как данные.
  Абстрактное синтаксическое дерево

• Задача IQueryable + IQueryProvider –
  проанализировать дерево выражений и
  преобразовать его в вызовы API
Func – код
Expression – код как данные
Expression / Func
Разложение Expression Tree
LINQ Providers
• LINQ 2 Amazon
http://weblogs.asp.net/fmarguerie/archive/2006/06
/26/Introducing-Linq-to-Amazon.aspx
LINQ Providers
• LINQ 2 Active Directory
http://linqtoad.codeplex.com/
LINQ Providers
• LINQ 2 Flickr – „Athena“
http://linqflickr.codeplex.com/
LINQ Providers
• LINQ 2 Twitter
http://linqtotwitter.codeplex.com/
Java
• Google Collections / Guava
http://code.google.com/p/guava-libraries/
Java
• Quaere
http://quaere.codehaus.org/
PHP
• PHPLinq
http://phplinq.codeplex.com
Javascript
• jLinq
http://hugoware.net/Projects/jLinq
Ресурсы
  • LINQ @ MSDN
  http://msdn.microsoft.com/en-
  us/library/bb397926.aspx


  • 101 LINQ Samples
  http://code.msdn.microsoft.com/101-
  LINQ-Samples-3fb9811b


  • Google/Bing/Blogs
Спасибо


yuri.mulenko@gmail.com

Weitere ähnliche Inhalte

Ähnlich wie Power of LINQ

Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsGetDev.NET
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Дизайн больших приложений в ФП
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФПAlexander Granin
 
Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)Vyacheslav Lapin
 
как учить программировать[1]
как учить программировать[1]как учить программировать[1]
как учить программировать[1]Pavel Penkov
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...it-people
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструментыRoman Dvornov
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Caché Native Access. InterSystems Meetup 2014
Caché Native Access. InterSystems  Meetup 2014Caché Native Access. InterSystems  Meetup 2014
Caché Native Access. InterSystems Meetup 2014InterSystems
 
Функциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridФункциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridАрсений Жижелев
 
LINQ: How It Works
LINQ: How It WorksLINQ: How It Works
LINQ: How It WorksGetDev.NET
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON
 
Как devops исчерпывает себя и что будет дальше
Как devops исчерпывает себя и что будет дальшеКак devops исчерпывает себя и что будет дальше
Как devops исчерпывает себя и что будет дальшеKirill Vechera
 
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Ontico
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsqlAnatoly Popov
 

Ähnlich wie Power of LINQ (20)

Rx
RxRx
Rx
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Дизайн больших приложений в ФП
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФП
 
Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)Functional reactive full stack development in java/js (JPoint ed.)
Functional reactive full stack development in java/js (JPoint ed.)
 
как учить программировать[1]
как учить программировать[1]как учить программировать[1]
как учить программировать[1]
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Caché Native Access. InterSystems Meetup 2014
Caché Native Access. InterSystems  Meetup 2014Caché Native Access. InterSystems  Meetup 2014
Caché Native Access. InterSystems Meetup 2014
 
Функциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridФункциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGrid
 
LINQ: How It Works
LINQ: How It WorksLINQ: How It Works
LINQ: How It Works
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
 
Как devops исчерпывает себя и что будет дальше
Как devops исчерпывает себя и что будет дальшеКак devops исчерпывает себя и что будет дальше
Как devops исчерпывает себя и что будет дальше
 
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 

Power of LINQ

Hinweis der Redaktion

  1. DSL для данных
  2. Кто работает с Данными?С какими? Откуда их берёте – БД, XML, вебсервисы, коллекции.Что вы с ними делаете? Какие операции?
  3. Проблема impedance mismatch. Примеры:Объекты плохо ложатся на реляционную структуру. ORMчастично решают проблему несоответствия структур таблиц обьектам, типам данных между БД и ЯП.Xpath для XML – отличный функционал, но не strongly typed.Регулярки для работы с текстом.
  4. Далее будет часто появлятсяобьект Юзер.Просто обьект с простыми св-вами: Имя, Дата рождения(структураdatetime), Пол М или F, Карма – ну какие то баллы.
  5. Пример как выглядит поиск и сортировка на LINQИз коллекции обектов выбираем пользователей рожденных до 1992г и сортируем их по карме. Получаем строго-типизированный обьектUser.Никакой динамики, никаких магических стрингов, запрос проверяется на этапе компиляции, есть интеллисенс.
  6. Появился в Microsoftв 2007 под руководством Erik’a Mejer’a.Он занимался работами над языками….Под его эгидой кроме LINQ ещё были разработаны Volta(аналог GWT) и Rx framework – очень интересная штука для реактивного программирования. Надеюсь расскажу на следующих встречах.Как мы жили до LINQ я себе не представляю.Очень мощный и гибкий инструмент.
  7. LINQ как технология(API) это…Давайте посмотрим каждый ингредиент, чтобы понимать как это вообще возможно.Начнем с Языковых Конструкций
  8. Вывод типа.Плюшка в том, что не надо явно указывать тип переменной. Её тип выведется компилятором. Посмотрите сразу после объявления переменную можно использовать. Строгая типизация сохраняется. Грандиозно экономит время на рефакторинге и когда начинаете писать длиииную строку, не зная ещё что будет в конце.Вару нельзя присвоить nullМожно использовать только для локальных переменных
  9. Анонимный класс можно декларировать и инициализировать налету.Часто бывает для сохранения промежуточных результатов надо быстро состряпать временный объектик из пары полей. Теперь легко.Опять же никакой динамики, строгая типизация, ошибки на этапе компиляции.Область видимости – метод.Можно только св-ва задавать, не методы. Типичный такой DTO внутри метода
  10. Возмем классический статический хелпер. В каждом проекте далеко ни один такой – для формирования дат, работы там со строками и т.д.Вызывают их ИмяКласса.ИмяМетода(параметры). Теперь если я на результате хочу вызвать хелпер, то надо опять все это дело оборачивать вызовом. Много шума.
  11. Товарищи из Микрософта решили по другому. Берем статический метод, помечаем первый параметр ключевым словом this. Теперь могу его использовать от любой стринговой переменной.Мы как бы «расширили» класс стринг, добавили туда метод, не переписывая его.Аналог кажется в руби есть – модули?
  12. Такие методы позволяют писать в continuationстиле.Я сам лично 2 раза имплементировал превращения времени.Очень удобно вместо тогобы чтобы каждый раз писать console.writline сделать расширение котрое можно от любого обьекта вызывать. Можно да, в экстеншен методы передавать параметры.Ну иногда можно и бизнес-логику континуэйшенами оформлять.
  13. Лямбды – анонимные делегаты/методы/функции. В .НЕТе есть такой тип- делегатыЯ могу создать переменную, типа метод/функция.Func – это такие методы которые возвращают значение. не void.isEven – это метод, с 1м параметром int, возвращает bool. И тут же если хочу его определение – это метод с параметром i(смотрите тип параметра указывать не надо, это есть в определении) такой чтоСкобки открываются проверь будет ли остаток от деления и на 2 равняться нолю, и верни результат проверки.Если лямбду можно записать одной строкой, то лишние скобки и ретурны можно опустить.После того как мы сделали лямбду, её можно допустим выполнить.
  14. Action – это для void методов
  15. Функции – это переменные. Их можно допустим передавать как параметры в методы или возвращать.Для примера – я могу сделать метод DoSafely который принимает в себя абсолютно любую функцию, которая в свою очередь имеет 1 параметр юзер и ничего не возвращает – void. И выполняет её отлавливая все ошибки.Теперь я могу по сути все методы, у которых совпадает сигнатура – выполнять безопасно.Реюзабилити кода повышается.Более гибкие решения можно придуматьДелегаты = абстрации на уровне методов. Ну как интерфейс и класс, только у нас делегат и метод.Вопрос к функциональщикам. Угадайте.. Наверное самое часто встречающаяся ф-ция высшего порядка в любом функц. ЯП
  16. Мап.Вот её алгоритм…Давайте попробуем заимплементить её используя знания которые мы теперь имеем.
  17. Параметры:Коллекция Иксов, Ienumerable– интерфейс всех коллекцийФункция, которая берёт Икс и возвращает ИгрекНаш метод возвращает коллекцию ИгрековНазовем её Мап.И дальше пошло тело…
  18. Всё, теперь на любой коллекции можно использовать.Смотрите берем массив интов, вызываем мап.А в качестве функции для трансформации задаем такую лямбду, которая вернет нам новый анонимный тип из пары Number – число и Булеан – четное ли оно.Тепеь мы получем в итоге коллекцию этих анонимных классов. Обратите внимание все строго типизировано опять же.
  19. Мап опытного программиста будет выглядеть так.Поскольку он знает что умные программисты за него уже всё написали.Linq уже содержит в себе метод который называется Select.
  20. Linq 2 Objects – не что иное как набор таких вот расширений поверх Ienumerable.Их там больше 50и штук на все случаи жизни. Давайте посмотрим некоторые примеры
  21. Select – трансформирует данные
  22. Where – фильтр по условию.Условие – лямбда с параметром = обьект и возвращающая тру/фолсПо сути берет лямбду как маску применят ко всем элементам в коллекции и возвращает только те, что удовлетворяют условию.Естественно, поскольку результат where – тоже коллекция, мы опять можем к не применить экстеншен
  23. OrderByOrderByDescendingThenByThenByDescending
  24. Обьединение по признакуЕсть юзеры, года в рождения. Надо найти тех счастливчиков кто родилсяБерем юзеровДжойним их на годаВ качестве «ключа», признака по которому сравнивать выбираем год(лямбдой)В качестве признака годов выбираем сам год,Последний параметр – что делать то с парой из юзера и года если они совпадают… в данном случае нас инетерсует только юзер – возвращаем его.luckyOnes – хотите верте хотите нет – коллекция пользователей.
  25. И таких операторов туевахуча.Вот ту не все, а только те которые с головы помнюИх там больше 50и.
  26. Смотрите сколько шума в запросе – точки, скобки, лямбды… везде переменная UАнтон Кекс вон смотрю исподлобья так на заглавные буквы в методах смотрит..Можно писать и по другому.
  27. Запрос делает абсолютно тоже самое, только убран шум.Добавилось слово from,чтобы как бы задать одну переменную для всех остальных лямбд
  28. Let – позволяет хранить результаты подзапроса в локальной переменной, чтобы не вычислять её каждый раз
  29. Концепт LINQ2Anything – переносим все эти красивые плюшки на другие источники данных, помимо коллекций.
  30. Expressions–такая штука, которая позволяет рассматриватьC# код как структуру данных
  31. Func – это код. Мы его по сути можем только вызвать.
  32. Expression – записывается как лямбда.Но теперь это не исполняемы код, аструктура данных. Посмотрите, можно вытащить параметры, тело… и проанализировать их.Некий аналог reflection’a но с более богатым API
  33. Смотрите с точки зрения пользователя – всё прозрачно. Передаем в метод лямбду. А метод уже если он принимает в себя Func – то будет func. Но если сигнатура метода с Expression параметром – то будет expressionПример – LINQ2SQL.Where – оператор работает уже не с Func а с Expression. Все наши знания можно повторно использовать. API – тот же самый.
  34. Пример как можно разложить дерево выражений.Зная абстрактное синтаксическое дерево и умея его распарсить, можно его перевести в другой язык или вызовы другого API. LINQ2SQL так и делает –парсит выражение и транслирует его в SQL.
  35. НекоторыеLINQ провайдеры к другим источникам данныхLINQ2Amazon – транслирует в вызовы Amazon webserviceAmazon.BookSearch - IQueryable
  36. Аналоги LINQ в других языках