Здравствуйте, TK, Вы писали:
TK>Это Linq этим занимается. Задача DLinq по полученному дереву сгенерировать SQL стейтменты которые уже будут передаваться в ADO.NET.
Ну, нельзя делегат в дерево превратить. Дерево нужно иметь зараниее. Так что как я понимаю, это все только дополнительные возможности.
VD>>Expression trees же позволяют построить АСТ кода. Упомянутое же АВК объявление — это возможность заставить компилятор вместо МСИЛ-а породить АСТ указанного лямбды.
TK>Именно по этому AST и генерируются SQL запросы
Ну, так его принимают только отдельные функции. А разные Where и.п. принимают на вход делегаты.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Нет, так не прокатит, там есть вполне определенные правила, когда применяется extension-метод.
Но, конечно, открывается простор для багов, если ПОЗЖЕ в класс добавили метод, ранее введенный extension'ом, но с чуть-чуть другим поведением.
Здравствуйте, VladD2, Вы писали:
TK>>Это Linq этим занимается. Задача DLinq по полученному дереву сгенерировать SQL стейтменты которые уже будут передаваться в ADO.NET.
VD>Ну, нельзя делегат в дерево превратить. Дерево нужно иметь зараниее. Так что как я понимаю, это все только дополнительные возможности.
Что-то ты не правильно понимаешь...
TK>>Именно по этому AST и генерируются SQL запросы VD>Ну, так его принимают только отдельные функции. А разные Where и.п. принимают на вход делегаты.
Кто тебе такое сказал? Есть разные реализации. Одни принимают на вход делегаты а другие Expressions. Те которые принимают Expressions умеют по ним генерировать нормальный SQL
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
VD>>Ну, нельзя делегат в дерево превратить. Дерево нужно иметь зараниее. Так что как я понимаю, это все только дополнительные возможности.
TK>Что-то ты не правильно понимаешь...
... или ты.
TK>>>Именно по этому AST и генерируются SQL запросы VD>>Ну, так его принимают только отдельные функции. А разные Where и.п. принимают на вход делегаты.
TK>Кто тебе такое сказал?
Декомпиляторы и описание стандарта:
26.7.2 The query expression pattern
The Query Expression Pattern establishes a pattern of methods that types can implement to support query expressions. Because query expressions are translated to method invocations by means of a syntactic mapping, types have considerable flexibility in how they implement the query expression pattern. For example, the methods of the pattern can be implemented as instance methods or as extension methods because the two have the same invocation syntax, and the methods can request delegates or expression trees because lambda expressions are convertible to both.
The recommended shape of a generic type C<T> that supports the query expression pattern is shown below. A generic type is used in order to illustrate the proper relationships between parameter and result types, but it is possible to implement the pattern for non-generic types as well.
delegate R Func<A,R>(A arg);
class C<T>
{
public C<T> Where(Func<T,bool> predicate);
public C<S> Select<S>(Func<T,S> selector);
public C<S> SelectMany<S>(Func<T,C<S>> selector);
public O<T> OrderBy<K>(Func<T,K> keyExpr);
public O<T> OrderByDescending<K>(Func<T,K> keyExpr);
public C<G<K,T>> GroupBy<K>(Func<T,K> keyExpr);
public C<G<K,E>> GroupBy<K,E>(Func<T,K> keyExpr, Func<T,E> elemExpr);
}
class O<T> : C<T>
{
public O<T> ThenBy<K>(Func<T,K> keySelector);
public O<T> ThenByDescending<K>(Func<T,K> keySelector);
}
class G<K,T>
{
public K Key { get; }
public C<T> Group { get; }
}
TK> Есть разные реализации. Одни принимают на вход делегаты а другие Expressions. Те которые принимают Expressions умеют по ним генерировать нормальный SQL
В том, то и дело, что умеют принимать этот самый Expression очень не многие методы.
Ладно. Тут нужно копать глубже.
ЗЫ
Ты кстит, не понял как превратить это АСТ в МСИЛ? Что-то я никак не въеду.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Но, конечно, открывается простор для багов, если ПОЗЖЕ в класс добавили метод, ранее введенный extension'ом, но с чуть-чуть другим поведением. здесь
26.7.2 The query expression pattern
The Query Expression Pattern establishes a pattern of methods that types can implement to support query expressions. Because query expressions are translated to method invocations by means of a syntactic mapping, types have considerable flexibility in how they implement the query expression pattern. For example, the methods of the pattern can be implemented as instance methods or as extension methods because the two have the same invocation syntax, and the methods can request delegates or expression trees because lambda expressions are convertible to both.
The recommended shape of a generic type C<T> that supports the query expression pattern is shown below. A generic type is used in order to illustrate the proper relationships between parameter and result types, but it is possible to implement the pattern for non-generic types as well.
То есть по идее таки можно запомнить несколько where в ExpressionTree, а потом при попытке проитерироваться по результату выполнить SQL запрос сконструированный из них.
Здравствуйте, TK, Вы писали:
TK>Expression trees используются в DLinq для генерации SQL запросов. т.к. это позволяет разобрать выражение
Прежде чем рассуждать, лучше бы ссылочками покидался. А то еле еле нашел о чем ты говорил.
Спецификация на DLinq — здесь — query от C#3.0 на реляционные базы
Спецификация на XLinq — здесь — query от C#3.0 на xml
iT>>Но, конечно, открывается простор для багов, если ПОЗЖЕ в класс добавили метод, ранее введенный extension'ом, но с чуть-чуть другим поведением. GZ>здесь
И если представить, что "раньше" метода Split в классе String не было, а был написан extension с таким методом, который по умолчанию считал разделителем пробел и табуляцию, а потом в классе String появился метод Split, который по умолчанию считает разделителем только пробел, то можно представить себе возможные проблемы.
Перекомпиляция пройдет без ошибок, но скомпилится с "родным" методом String.Split вместо старого StringExt.Split.
И будет работать по-другому.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
S>> Для Delphi это было необходимо для совместимости старой объектной модели с нетовской. Но эта фишка сразу всем понравилась.
VD>Думаю, что "совместимости старой объектной модели с нетовской" была только дополнительным побуждющим фактором. Или их дизайнеров языка зря платят зарплату. Такие изменения дожны серьезно продумываться.
Не дополнительным, а необходимым для облегчения переноса нативных приложений. Понятно, что такой сахар (вызов метода класса, вместо статичесих методов) пришелся всем по вкусу.
Вот их переделки для совместимости. http://www.rsdn.ru/Forum/Message.aspx?mid=548308&only=1
Здравствуйте, mogadanez, Вы писали:
M>именно потому что это не тюпла, а ее имитация. =)) M>настоящая тюпла содержит неименованый кортеж
Именованные, не именованные — это не важно. Важно, что это не полноценный тип. Это все портит. А как вынимать данные не важно. Не именованность в ФЯ мне лично не нравится.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, TK, Вы писали:
TK>Но, в настоящее время, работает это на текущей версии .NET 2.0 т.е. пока есть только компилятор реализующий нужный сахар.
Тем не менее релиз пока планируется в новой студии. Может к тому времени и еще что то добавят. Вот nullable types тоже раньше сахаром были.
Здравствуйте, _FRED_, Вы писали:
_FR>Гхм. Если не сложно, а что за история?
Поищи здесь и в философии поиском, совсем недавно была заметка о том, почему пришлось править рантайм в самый последний момент. Вкратце — проблема в боксинге. Т.е. в текущем варианте:
int? i = null;
Console.WriteLine(i == null); // Выводится True, что нормально.object o = i;
Console.WriteLine(o == null); // Выводится False, что, мягко говоря, не очень логично.
Здравствуйте, Serginio1, Вы писали:
S> Не дополнительным, а необходимым для облегчения переноса нативных приложений.
Если бы дело было только в переносе (и не нативных, а, прежде всего, VCLных), то намного проще было бы написать преобразователь навроде R#, благо язык делфей простой.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> Не дополнительным, а необходимым для облегчения переноса нативных приложений.
AVK>Если бы дело было только в переносе (и не нативных, а, прежде всего, VCLных), то намного проще было бы написать преобразователь навроде R#, благо язык делфей простой.
Так или иначе эти преобразования проходят, правда сразу в мсил. Система хэлперов больше подходит для этих преобразований (по сути описывающие действия преобразований) являясь более универсальной .
... << RSDN@Home 1.1.4 stable rev. 510>>
и солнце б утром не вставало, когда бы не было меня