Re[8]: Динамическое формирование SQL-запросов из C# кода
От: Arsen.Shnurkov  
Дата: 25.09.10 20:43
Оценка:
IT> Если точная структура не известна, то нужно создавать запрос в виде некоего SQL AST, а затем с помощью SQL провайдеров создавать SQL под конкретную СУБД.
IT> Соответствующие средства есть в BLToolkit, в нём Linq-провайдер как раз организован по схеме Linq-provider -> SqlQuery -> SqlProvider.

1) Правильно ли я понимаю, что AST надо создавать при помощи класса Expression и всего вот этого ужаса:
http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx
?

Нашел вот такую штуку:
http://expressionbuilder.codeplex.com/

2) Нельзя ли обойтись без второго провайдера, дополнительного к .Net Data Provider (типа MySqlDataProvider)?
Прочитал, как создать провайдера программно:
http://www.bltoolkit.net/Doc.LinqConfig.ashx
может ли быть так, что .Net предоставляет средства для формирования запросов в рамках .Net Data Provider?
Ведь как-то же они создают SQL запросы из Linq...

Неясно, зачем для моей задачи нужен BLToolkit,
до конца неясно, как сделать без него.
Re[8]: Динамическое формирование SQL-запросов из C# кода
От: Arsen.Shnurkov  
Дата: 25.09.10 22:23
Оценка:
IT> Для Linq модель данных должна быть известна во время компиляции

не для Linq, а для Linq-провайдера to SQL, который применяется по-умолчанию.

Можно ли реализовать другой провайдер,
основная задача которого — абстрагировать прикладного программиста от синтаксиса SQL?
Этот новый провайдер должен уметь (можно магическим прошитым в коде способом) обращаться
к нужному виду .Net Data Provider-а.

основная задача .Net Data Provider-а — абстрагировать от особенностей синтаксиса БД.

В новом Linq-провайдере в качестве реализации использовать не конкретные типы, а коллекции,
чтобы не генерировать для них классы на ходу.
А дополнительную метаинформацию, пусть получает где-нибудь еще, из базы, например.

При этом не получится статической проверки типов,
но зато две другие нужные цели будут достигнуты...
(Цели — 1) это независимый от БД код запросов 2) это трансляция к нужному типу БД)
Re[8]: Динамическое формирование SQL-запросов из C# кода
От: Arsen.Shnurkov  
Дата: 26.09.10 06:27
Оценка:
IT> Задай автор свой вопрос более внятно, он бы уже давно получил ответ.

постарался задать вопрос более внятно
Автор: Arsen.Shnurkov
Дата: 26.09.10
Re[8]: Динамическое формирование SQL-запросов из C# кода
От: Arsen.Shnurkov  
Дата: 26.09.10 07:32
Оценка:
IT> Соответствующие средства есть в BLToolkit, в нём Linq-провайдер как раз организован по схеме Linq-provider -> SqlQuery -> SqlProvider.

Раньше в файле http://bl-toolkit.googlecode.com/svn› trunk› Source› Data› Linq› DataContext.cs
был метод
string IDataContext.GetSqlText(object query)

А теперь на SVN нет самого класса DataContext, куда он делся и почему?
Re[9]: Динамическое формирование SQL-запросов из C# кода
От: IT Россия linq2db.com
Дата: 28.09.10 02:03
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>1) Правильно ли я понимаю, что AST надо создавать при помощи класса Expression и всего вот этого ужаса:

AS>http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx
AS>?

С помощью этого создаётся Expression Tree, в пронципе, тоже что-то типа AST. Далее, всего лишь навсего, это AST нужно будет разобрать и сформировать по нему SQL. У меня на решение этой задачи ушёл год

AS>2) Нельзя ли обойтись без второго провайдера, дополнительного к .Net Data Provider (типа MySqlDataProvider)?


Аналога SqlProvider в .NET нет. Может быть можно как-то вскрыть потроха EF, но про официальный и задокументированный от MS мне ничего не известно.

AS>может ли быть так, что .Net предоставляет средства для формирования запросов в рамках .Net Data Provider?

AS>Ведь как-то же они создают SQL запросы из Linq...

Они пишут Linq-провайдер, который парсит Expression Tree и формируют по нему SQL.

AS>Неясно, зачем для моей задачи нужен BLToolkit,


BLToolkit предоставляет такой же как и другие Linq провайдер со своими достоинствами и преимуществами. Разница лишь в том, что обычная схема у Linq-провайдеров, видимая снаружи — это Expression Tree (ET) -> SQL, а у BLToolkit — это ET -> SqlQuery -> SqlProvider -> SQL. Другими словами, дизайн потрохов всего хозяйства заточен на публичное использование и расширение.

Если твоя модель данных заранее определена, то Linq тебе вполне подойдёт. ET можно без проблем формировать программно без помощи компилятора. Большинство провайдеров такое ET схавают и выдадут тебе необходимый результат. BLToolkit здесь может быть интересен лишь по причине наличия DML и более широкого спектра поддерживаемых БД.

Если модель данных заранее не известна, то тебе нужна схема SqlQuery (Sql Builder) -> SqlProvider -> SQL. BLToolkit её предоставляет. Может быть лишь потребуется отполировать API, т.к. хотя и с оглядкой на независимое использование, он всё же писался под Linq.

AS>до конца неясно, как сделать без него.


Написать свой велосипед.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Динамическое формирование SQL-запросов из C# кода
От: IT Россия linq2db.com
Дата: 28.09.10 02:08
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>не для Linq, а для Linq-провайдера to SQL, который применяется по-умолчанию.

AS>Можно ли реализовать другой провайдер,
AS>основная задача которого — абстрагировать прикладного программиста от синтаксиса SQL?
AS>Этот новый провайдер должен уметь (можно магическим прошитым в коде способом) обращаться
AS>к нужному виду .Net Data Provider-а.

Зачем магия? Указал в конфиге Connection String и обратились куда нужно.

AS>основная задача .Net Data Provider-а — абстрагировать от особенностей синтаксиса БД.


SqlProvider рулит.

AS>В новом Linq-провайдере в качестве реализации использовать не конкретные типы, а коллекции,

AS>чтобы не генерировать для них классы на ходу.
AS>А дополнительную метаинформацию, пусть получает где-нибудь еще, из базы, например.

Да без проблем. Sql Builder + Sql Provider.

AS>При этом не получится статической проверки типов,

AS>но зато две другие нужные цели будут достигнуты...
AS>(Цели — 1) это независимый от БД код запросов 2) это трансляция к нужному типу БД)

Круто!
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Динамическое формирование SQL-запросов из C# кода
От: Arsen.Shnurkov  
Дата: 29.09.10 06:26
Оценка:
IT> AST нужно будет разобрать и сформировать по нему SQL.
IT> дизайн потрохов всего хозяйства заточен на публичное использование и расширение.
IT> У меня на решение этой задачи ушёл год

IT> Написать свой велосипед.


Не вижу необходимости
1) решать задачу формирования SQL по ET, потому что она уже решена в промышленном решении от Microsoft,
2) использовать стороннюю библиотеку, так как мне не надо поддержки дополнительных БД и расширять что-либо внутри

IT> Если твоя модель данных заранее определена, то Linq тебе вполне подойдёт.


я уже говорил, что "определена" — это непонятное мне слово.
значит ли оно что надо генерировать конкретные классы при помощи Reflection.Emit
или можно без этого обойтись (и как обойтись, если можно)

IT> ET можно без проблем формировать программно без помощи компилятора.


Вот это именно то, что мне наверное надо.
Неясно следующее:
— как сделать (и можно ли), чтобы не приходилось генерировать типы при помощи Reflection.Emit
для того, чтобы заработал механизм MS
— как формировать ET так, чтобы их понимал стандартный Linq-провайдер
(туториал где-нибудь есть по переводу запросов SQL в ET ?)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.