PDA

Просмотр полной версии : Linq


Modus
28.07.2009, 02:21
Полтора года назад я начал разрабатывать фреймворк Botan, включающий в себя ORM и генератор форм. Сейчас он в несколько доработанном виде внедрен в реальную практику, и я, удовлетворив свои творческие амбиции и наигравшись в красивую архитектуру, решил больше не выпендриваться, и освоить-таки стандартный Linq2Sql. Я и раньше бегло изучал этот ORM, и он казался мне очень неплохим.

Через полчаса после попытки сделать на нём пробное приложение радость удалилась далеко и надолго. Похоже, что на трансляции лямбда-выражений в SQL-запросы его прелести заканчиваются. То, что для обработки изменений значений свойств он генерирует partial-методы, воспроизводится за полчаса: большая трудоёмкость только в создании обработчика лямбда-выражений. Причём большая настолько, что делать это самому - сущее безумие.

Я давно уже думал о том, чтобы прикрутить к Botan класс SqlProvider, который преобразует лямбда-выражения в SQL-запросы в Linq2Sql, но пока не придумал как. Похоже, что придётся обойтись без этой доли прогрессивного синтаксического сахара и сидеть на старом добром паттерне Query object.

Вот уж воистину, свои велосипеды ближе к телу. При всём уважении к Microsoft.

Makinson
28.07.2009, 02:38
неправильно ты дядя Фёдор бутерброд ешь...

Виктор
28.07.2009, 07:05
Modus, а если взять заведомо упрощённый синтаксис. Сходу могу порекомендовать синтаксис @ функций от LotusNotes. @Функция(Параметр1; Параметр2; Параметр3;..)

Modus
28.07.2009, 10:35
В LotusNotes задача языковой интеграции не решена. По идее, фишка Linq как раз в том, что запросы к базе пишутся прямо в коде на C# со всеми примуществами строгой типизацией и т.п. После работы в Axapta я относился к Linq в духе "давно пора".

А так - что в связке .NET + SQL, что в Lotus Notes, императивная часть и функцональная пишутся на разных языках, которые как-то друг с другом взаимодействуют. Я хотел отойти от методов 2005 года, перейти на более современные технологии, но столкнулся с тем, что они нифига не удобнее.

Макинсон, а как правильно?

Виктор
28.07.2009, 10:42
Да, не решена, только это глюк не синтаксиса, а среды.

Я этот синтаксис потому предложил, что он однозначный, парсер писать -- плёвое дело. Остаётся только словарь определить. Ну и изначально заложить расширяемость.

Modus
28.07.2009, 11:06
Парсер там в принципе не нужен. Лямбда-выражения в C# уже приходят в виде дерева. Нужно по этому дереву построить запрос SQL. Я не владею математическим аппаратом преобразования одного дерева в другое, да и представление лямбда-выражений в виде дерева простотой не отличается. DevExpress'овские фильтры я в свою объектную модель запроса уже преобразую, но кривовато, работает только в простых случаях (для реальной практики годится, потому что сложные случаи маловероятны).

Кстати, Макинсон, очень рад тебя видеть тут в добром здравии.

Виктор
28.07.2009, 11:35
Формат дерева покурить где можно? Может тоже где заюзаю.

Modus
28.07.2009, 14:07
Ничего лучше чем http://blogs.msdn.com/charlie/archive/2008/01/31/expression-tree-basics.aspx не нагуглил.

Makinson
28.07.2009, 16:44
Спасибо.
Я не знаток этой тематики...

Modus
28.07.2009, 17:49
Тогда что ты имел в виду этой цитатой?

Modus
01.08.2009, 02:32
Так. Похоже, дела немного налаживаются. Сейчас я копаю в сторону реализации метамодели с использованием паттерна Proxy, чтобы реализовать только то, что мне надо. Там вроде бы всё есть для того чтобы взаимодействовать с Sql провайдером своими средствами...

Modus
14.08.2009, 10:47
Радость была преждевременной.

Теперь я уперся в то, что у меня никак не вызывается метод OnLoaded.

Я создаю класс, который заполняется автоматически сложным запросом, такой таблицы в базе нет. Теоретически, Linq должен автоматически найти этот метод и вызвать его после привязки, но увы. Не помогает ни создание нового типа контекста, ни метамодель.

Буду рыться в исходниках рефлектором...

Modus
15.08.2009, 01:47
Похоже, тему пора переносить в мой персональный раздел, поскольку она потихоньку превращается в дневник моих плясок с бубнов вокруг Linq...

OnLoaded вызвался. Он не вызывался из-за неправильно написанного прокси и из-за отсутствия первичного ключа у таблицы.

Modus
03.01.2010, 22:51
Очередной подступ к вершине
http://blogs.msdn.com/mattwar/pages/linq-links.aspx
Прилагается QIToolkit - платформа для разработки LINQ-провайдеров. Объём работы вроде бы сокращается, но всё ещё кажется неподъёмным. Но раз он смог, то почему бы не...?

Modus
15.08.2010, 02:09
Смог.

Не совсем по стандарту, но для внутренних целей годится.