Просмотр полной версии : Linq
Полтора года назад я начал разрабатывать фреймворк Botan, включающий в себя ORM и генератор форм. Сейчас он в несколько доработанном виде внедрен в реальную практику, и я, удовлетворив свои творческие амбиции и наигравшись в красивую архитектуру, решил больше не выпендриваться, и освоить-таки стандартный Linq2Sql. Я и раньше бегло изучал этот ORM, и он казался мне очень неплохим.
Через полчаса после попытки сделать на нём пробное приложение радость удалилась далеко и надолго. Похоже, что на трансляции лямбда-выражений в SQL-запросы его прелести заканчиваются. То, что для обработки изменений значений свойств он генерирует partial-методы, воспроизводится за полчаса: большая трудоёмкость только в создании обработчика лямбда-выражений. Причём большая настолько, что делать это самому - сущее безумие.
Я давно уже думал о том, чтобы прикрутить к Botan класс SqlProvider, который преобразует лямбда-выражения в SQL-запросы в Linq2Sql, но пока не придумал как. Похоже, что придётся обойтись без этой доли прогрессивного синтаксического сахара и сидеть на старом добром паттерне Query object.
Вот уж воистину, свои велосипеды ближе к телу. При всём уважении к Microsoft.
Makinson
28.07.2009, 02:38
неправильно ты дядя Фёдор бутерброд ешь...
Modus, а если взять заведомо упрощённый синтаксис. Сходу могу порекомендовать синтаксис @ функций от LotusNotes. @Функция(Параметр1; Параметр2; Параметр3;..)
В LotusNotes задача языковой интеграции не решена. По идее, фишка Linq как раз в том, что запросы к базе пишутся прямо в коде на C# со всеми примуществами строгой типизацией и т.п. После работы в Axapta я относился к Linq в духе "давно пора".
А так - что в связке .NET + SQL, что в Lotus Notes, императивная часть и функцональная пишутся на разных языках, которые как-то друг с другом взаимодействуют. Я хотел отойти от методов 2005 года, перейти на более современные технологии, но столкнулся с тем, что они нифига не удобнее.
Макинсон, а как правильно?
Да, не решена, только это глюк не синтаксиса, а среды.
Я этот синтаксис потому предложил, что он однозначный, парсер писать -- плёвое дело. Остаётся только словарь определить. Ну и изначально заложить расширяемость.
Парсер там в принципе не нужен. Лямбда-выражения в C# уже приходят в виде дерева. Нужно по этому дереву построить запрос SQL. Я не владею математическим аппаратом преобразования одного дерева в другое, да и представление лямбда-выражений в виде дерева простотой не отличается. DevExpress'овские фильтры я в свою объектную модель запроса уже преобразую, но кривовато, работает только в простых случаях (для реальной практики годится, потому что сложные случаи маловероятны).
Кстати, Макинсон, очень рад тебя видеть тут в добром здравии.
Формат дерева покурить где можно? Может тоже где заюзаю.
Ничего лучше чем http://blogs.msdn.com/charlie/archive/2008/01/31/expression-tree-basics.aspx не нагуглил.
Makinson
28.07.2009, 16:44
Спасибо.
Я не знаток этой тематики...
Тогда что ты имел в виду этой цитатой?
Так. Похоже, дела немного налаживаются. Сейчас я копаю в сторону реализации метамодели с использованием паттерна Proxy, чтобы реализовать только то, что мне надо. Там вроде бы всё есть для того чтобы взаимодействовать с Sql провайдером своими средствами...
Радость была преждевременной.
Теперь я уперся в то, что у меня никак не вызывается метод OnLoaded.
Я создаю класс, который заполняется автоматически сложным запросом, такой таблицы в базе нет. Теоретически, Linq должен автоматически найти этот метод и вызвать его после привязки, но увы. Не помогает ни создание нового типа контекста, ни метамодель.
Буду рыться в исходниках рефлектором...
Похоже, тему пора переносить в мой персональный раздел, поскольку она потихоньку превращается в дневник моих плясок с бубнов вокруг Linq...
OnLoaded вызвался. Он не вызывался из-за неправильно написанного прокси и из-за отсутствия первичного ключа у таблицы.
Очередной подступ к вершине
http://blogs.msdn.com/mattwar/pages/linq-links.aspx
Прилагается QIToolkit - платформа для разработки LINQ-провайдеров. Объём работы вроде бы сокращается, но всё ещё кажется неподъёмным. Но раз он смог, то почему бы не...?
Смог.
Не совсем по стандарту, но для внутренних целей годится.
Работает на vBulletin® версия 3.8.9 Beta 3. Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot