SlideShare a Scribd company logo
Использование деревьев выражений
.Net для создания транслятора на
языке C#
Автор: Алексей Садомов
К.ф.-м.н., Microsoft MVP
Транслятор
Таблица реляционной БД
Список Sharepoint
Выборка данных в БД и Sharepoint
• SQL:
• CAML:
Структура CAML запроса
Примеры операций в CAML
Обозначение операции в CAML Название
Eq Равно
Neq Не равно
Geq Больше или равно
Gt Больше
Leq Меньше или равно
Lt Меньше
BeginsWith Начнается с
Contains Содержит
IsNotNull Проверка на непустое значение
IsNull Проверка на пустое значение
And Логическое И
Or Логическое ИЛИ
Составной запрос с двумя условиями
Запросы с тремя и более условиями
Запрос с использованием Camlex
Трансляция C# в CAML
Составной запрос
Создание деревьев выражений на
основе лямбда-выражений и API
Создание деревьев выражений на
основе лямбда-выражений и API
Компиляция и исполнение кода
Синтаксический анализ деревьев
выражений
Интерфейс IQuery
Дерево выражений для построения CAML запроса
Синтаксический анализ
Схема преобразования
Поддерживаемые операции
Название Пример
AndAlsoOperation x => (string)x["Title"] == "Bug" &&
(string)x["Status"] == "Open"
ArrayOperation x => new[]{ x["Title"], x["Status"] }
BeginsWithOperation x => ((string)x["Title"]).StartsWith("Bug")
ContainsOperation x => ((string)x["Title"]).Contains("Bug")
DateRangesOverlapOperation …
EqOperation x => (string)x["Title"] == "Bug"
GeqOperation x => (int)x["Votes"] >= 1
GtOperation x => (int)x["Votes"] > 1
InOperation x => new[]{ 1, 2, 3 }.Contains((int)x["Vote"])
IsNotNullOperation x => (string)x["Title"] != null
IsNullOperation x => (string)x["Title"] == null
JoinOperation …
LeqOperation x => (int)x["Vote"] <= 1
LtOperation x => (int)x["Vote"] < 1
NeqOperation x => (string)x["Title"] != "Bug"
OrElseOperation x => (string)x["Title"] == "Bug" ||
(string)x["Status"] == "Open"
ProjectedFieldOperation …
Анализаторы операций
Анализатор для операции Eq
Генерация CAML для операции Eq
EqOperation:
FieldRefOperand: TextValueOperand:
Примеры Value-операндов
Название Базовый класс
BooleanValueOperand ValueOperand<bool>
DateTimeValueOperand ValueOperand<DateTime>
GuidValueOperand ValueOperand<Guid>
IntegerValueOperand ValueOperand<int>
NumberValueOperand ValueOperand<double>
TextValueOperand ValueOperand<string>
NullValueOperand IOperand
Передача неконстантных значений
Вычисление результата
неконстантных выражений
Явное преобразование типа к object
для типов-значений
Output: 1
Expression of type 'System.Int32' cannot be used
for return type 'System.Object'
Output: 1
Построение составных запросов
Построение составных запросов
Построение составных запросов
Обратное преобразование
Анализаторы для обратного
преобразования
Проверка CAML на корректность для операции Eq
Построение выражения для операции Eq
Соединение выражений
Кодогенерация с помощью ExpressionToCode
camlex-online.org
Ссылки и ресурсы
• http://sadomovalex.blogspot.com
• https://camlex.codeplex.com
• http://camlex-online.org
• https://msdn.microsoft.com/ru-ru/library/bb397951.aspx
• http://exprtreevisualizer.codeplex.com
• https://github.com/eamonnerbonne/expressiontocode

More Related Content

Similar to Использование деревьев выражений .Net для создания транслятора на языке C#

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Fedor Lavrentyev
 
Visual Paradigm
Visual ParadigmVisual Paradigm
Visual Paradigmanddriga
 
лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)djbelyakk
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
Alex Ott
 
Xslt
XsltXslt
Опыт внедрения Greenplum в Aviasales.ru
Опыт внедрения Greenplum в Aviasales.ruОпыт внедрения Greenplum в Aviasales.ru
Опыт внедрения Greenplum в Aviasales.ru
Максим Селиверстов
 
Виртуализация критически важных приложений
Виртуализация критически важных приложенийВиртуализация критически важных приложений
Виртуализация критически важных приложенийJack Chikovany
 
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
Alexander Byndyu
 
Class queries
Class queriesClass queries
Class queries
Eduard Lebediuk
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
GoSharp
 
Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Andrey Listochkin
 
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Nicolay Velizhanin
 
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit TechGraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
Zlit
 
владивосток форум новости технологий 2015
владивосток форум новости технологий 2015владивосток форум новости технологий 2015
владивосток форум новости технологий 2015
Elena Ometova
 
Sql server clr integration
Sql server clr integration Sql server clr integration
Sql server clr integration
Alex Tumanoff
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
Levon Avakyan
 
Больше чем анализ
Больше чем анализБольше чем анализ
Больше чем анализ
SQALab
 
Развитие программной платформы Cisco WAN Automation Engine
Развитие программной платформы Cisco WAN Automation EngineРазвитие программной платформы Cisco WAN Automation Engine
Развитие программной платформы Cisco WAN Automation Engine
Cisco Russia
 
Описание и архитектура TFS 2008
Описание и архитектура TFS 2008Описание и архитектура TFS 2008
Описание и архитектура TFS 2008
Александр Шамрай
 

Similar to Использование деревьев выражений .Net для создания транслятора на языке C# (20)

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Visual Paradigm
Visual ParadigmVisual Paradigm
Visual Paradigm
 
лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Xslt
XsltXslt
Xslt
 
Опыт внедрения Greenplum в Aviasales.ru
Опыт внедрения Greenplum в Aviasales.ruОпыт внедрения Greenplum в Aviasales.ru
Опыт внедрения Greenplum в Aviasales.ru
 
Виртуализация критически важных приложений
Виртуализация критически важных приложенийВиртуализация критически важных приложений
Виртуализация критически важных приложений
 
Архитектура облачных приложений. Типовые шаблоны, Azure University
Архитектура облачных приложений. Типовые шаблоны, Azure UniversityАрхитектура облачных приложений. Типовые шаблоны, Azure University
Архитектура облачных приложений. Типовые шаблоны, Azure University
 
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
 
Class queries
Class queriesClass queries
Class queries
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014
 
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
 
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit TechGraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
 
владивосток форум новости технологий 2015
владивосток форум новости технологий 2015владивосток форум новости технологий 2015
владивосток форум новости технологий 2015
 
Sql server clr integration
Sql server clr integration Sql server clr integration
Sql server clr integration
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
 
Больше чем анализ
Больше чем анализБольше чем анализ
Больше чем анализ
 
Развитие программной платформы Cisco WAN Automation Engine
Развитие программной платформы Cisco WAN Automation EngineРазвитие программной платформы Cisco WAN Automation Engine
Развитие программной платформы Cisco WAN Automation Engine
 
Описание и архитектура TFS 2008
Описание и архитектура TFS 2008Описание и архитектура TFS 2008
Описание и архитектура TFS 2008
 

Использование деревьев выражений .Net для создания транслятора на языке C#