Re[4]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.05 16:38
Оценка:
Здравствуйте, TK, Вы писали:

TK>Это Linq этим занимается. Задача DLinq по полученному дереву сгенерировать SQL стейтменты которые уже будут передаваться в ADO.NET.


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

VD>>Expression trees же позволяют построить АСТ кода. Упомянутое же АВК объявление — это возможность заставить компилятор вместо МСИЛ-а породить АСТ указанного лямбды.


TK>Именно по этому AST и генерируются SQL запросы


Ну, так его принимают только отдельные функции. А разные Where и.п. принимают на вход делегаты.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Краткий пересказ
От: Igor Trofimov  
Дата: 15.09.05 17:27
Оценка:
GZ>
GZ>//я написал
GZ>public MyCryptoClass
GZ>{
GZ>public Crypt(){CryptForSecure();};
GZ>}
GZ>//доброжелатель ответил
GZ>public static class Extensions
GZ>{
GZ>public static Crypt(this MyCryptoClass class){SaveForUnsecure();};
GZ>}
GZ>


Нет, так не прокатит, там есть вполне определенные правила, когда применяется extension-метод.
Но, конечно, открывается простор для багов, если ПОЗЖЕ в класс добавили метод, ранее введенный extension'ом, но с чуть-чуть другим поведением.
Re[5]: Краткий пересказ
От: TK Лес кывт.рф
Дата: 15.09.05 17:31
Оценка:
Здравствуйте, VladD2, Вы писали:

TK>>Это Linq этим занимается. Задача DLinq по полученному дереву сгенерировать SQL стейтменты которые уже будут передаваться в ADO.NET.


VD>Ну, нельзя делегат в дерево превратить. Дерево нужно иметь зараниее. Так что как я понимаю, это все только дополнительные возможности.


Что-то ты не правильно понимаешь...

TK>>Именно по этому AST и генерируются SQL запросы

VD>Ну, так его принимают только отдельные функции. А разные Where и.п. принимают на вход делегаты.

Кто тебе такое сказал? Есть разные реализации. Одни принимают на вход делегаты а другие Expressions. Те которые принимают Expressions умеют по ним генерировать нормальный SQL
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.05 17:52
Оценка: -1
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Краткий пересказ
От: GlebZ Россия  
Дата: 15.09.05 18:05
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Но, конечно, открывается простор для багов, если ПОЗЖЕ в класс добавили метод, ранее введенный extension'ом, но с чуть-чуть другим поведением.

здесь
Автор: VladD2
Дата: 15.09.05


С уважением, Gleb.
Re[7]: Краткий пересказ
От: Belsen  
Дата: 15.09.05 18:14
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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 запрос сконструированный из них.
I might be wrong...
Re[2]: Краткий пересказ
От: GlebZ Россия  
Дата: 15.09.05 18:57
Оценка: 28 (3)
Здравствуйте, TK, Вы писали:

TK>Expression trees используются в DLinq для генерации SQL запросов. т.к. это позволяет разобрать выражение

Прежде чем рассуждать, лучше бы ссылочками покидался. А то еле еле нашел о чем ты говорил.
Спецификация на DLinq — здесь — query от C#3.0 на реляционные базы
Спецификация на XLinq — здесь — query от C#3.0 на xml

С уважением, Gleb.
Re[4]: Краткий пересказ
От: Igor Trofimov  
Дата: 15.09.05 19:00
Оценка:
iT>>Но, конечно, открывается простор для багов, если ПОЗЖЕ в класс добавили метод, ранее введенный extension'ом, но с чуть-чуть другим поведением.
GZ>здесь
Автор: VladD2
Дата: 15.09.05


Не-а.. не будет в этой ситуации ошибки:

    static class StringExt
    {
        public static string[] Split(this string s)
        {
            return new string[] {};
        }
    }
    ...
    Console.WriteLine("1 2 3 4 5 6 7 8 9 10".Split().Length); // Выведет 10


И если представить, что "раньше" метода Split в классе String не было, а был написан extension с таким методом, который по умолчанию считал разделителем пробел и табуляцию, а потом в классе String появился метод Split, который по умолчанию считает разделителем только пробел, то можно представить себе возможные проблемы.

Перекомпиляция пройдет без ошибок, но скомпилится с "родным" методом String.Split вместо старого StringExt.Split.
И будет работать по-другому.
Re[4]: Краткий пересказ
От: mogadanez Чехия  
Дата: 16.09.05 08:10
Оценка:
VD>Твой примет тоже не прокатывает. Но у полей есть имена, так что можно писать так:
VD>
VD>var x = new { A = "one", B = 1 };
VD>string a = x.A;
VD>int b    = x.B;
VD>


именно потому что это не тюпла, а ее имитация. =))
настоящая тюпла содержит неименованый кортеж
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[6]: Краткий пересказ
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.09.05 08:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Serginio1, Вы писали:


S>> Для Delphi это было необходимо для совместимости старой объектной модели с нетовской. Но эта фишка сразу всем понравилась.


VD>Думаю, что "совместимости старой объектной модели с нетовской" была только дополнительным побуждющим фактором. Или их дизайнеров языка зря платят зарплату. Такие изменения дожны серьезно продумываться.

Не дополнительным, а необходимым для облегчения переноса нативных приложений. Понятно, что такой сахар (вызов метода класса, вместо статичесих методов) пришелся всем по вкусу.
Вот их переделки для совместимости.
http://www.rsdn.ru/Forum/Message.aspx?mid=548308&amp;only=1
Автор: Serginio1
Дата: 24.02.04
... << RSDN@Home 1.1.4 stable rev. 510>>
и солнце б утром не вставало, когда бы не было меня
Re[5]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.05 11:41
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>именно потому что это не тюпла, а ее имитация. =))

M>настоящая тюпла содержит неименованый кортеж

Именованные, не именованные — это не важно. Важно, что это не полноценный тип. Это все портит. А как вынимать данные не важно. Не именованность в ФЯ мне лично не нравится.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Краткий пересказ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.09.05 11:51
Оценка:
Здравствуйте, TK, Вы писали:

TK>Но, в настоящее время, работает это на текущей версии .NET 2.0 т.е. пока есть только компилятор реализующий нужный сахар.


Тем не менее релиз пока планируется в новой студии. Может к тому времени и еще что то добавят. Вот nullable types тоже раньше сахаром были.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[6]: Краткий пересказ
От: _FRED_ Черногория
Дата: 16.09.05 12:08
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вот nullable types тоже раньше сахаром были.


Гхм. Если не сложно, а что за история?
<< RSDN@Home 1.2.0 alpha rev. 616 >> =03:55= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Краткий пересказ
От: _FRED_ Черногория
Дата: 16.09.05 12:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вот nullable types тоже раньше сахаром были.


Гхм. Если не сложно, а что за история?
<< RSDN@Home 1.2.0 alpha rev. 616 >> =03:55= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Краткий пересказ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.09.05 12:34
Оценка: 28 (4)
Здравствуйте, _FRED_, Вы писали:

_FR>Гхм. Если не сложно, а что за история?


Поищи здесь и в философии поиском, совсем недавно была заметка о том, почему пришлось править рантайм в самый последний момент. Вкратце — проблема в боксинге. Т.е. в текущем варианте:
int? i = null;
Console.WriteLine(i == null); // Выводится True, что нормально.
object o = i;
Console.WriteLine(o == null); // Выводится False, что, мягко говоря, не очень логично.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[7]: Краткий пересказ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.09.05 12:34
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Не дополнительным, а необходимым для облегчения переноса нативных приложений.


Если бы дело было только в переносе (и не нативных, а, прежде всего, VCLных), то намного проще было бы написать преобразователь навроде R#, благо язык делфей простой.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[8]: Краткий пересказ
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.09.05 13:02
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


S>> Не дополнительным, а необходимым для облегчения переноса нативных приложений.


AVK>Если бы дело было только в переносе (и не нативных, а, прежде всего, VCLных), то намного проще было бы написать преобразователь навроде R#, благо язык делфей простой.

Так или иначе эти преобразования проходят, правда сразу в мсил. Система хэлперов больше подходит для этих преобразований (по сути описывающие действия преобразований) являясь более универсальной .
... << RSDN@Home 1.1.4 stable rev. 510>>
и солнце б утром не вставало, когда бы не было меня
Re: C# 3.0 Language Innovations
От: Кирилл Осенков Украина
Дата: 16.09.05 23:23
Оценка:
http://msdn.microsoft.com/vcsharp/future/
Re[2]: C# 3.0 Language Innovations
От: Кирилл Осенков Украина
Дата: 16.09.05 23:31
Оценка:
Здравствуйте, Кирилл Осенков, Вы писали:

КО>http://msdn.microsoft.com/vcsharp/future/


Виноват. Не прочитал ветку. Ссылка уже была выше.
Re[3]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.09.05 01:04
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Не, это работать не будет. Во-первых это просто неверный синтаксис, правильно так:

AVK>
AVK>var dict2 = new Dictionary<string, int>
AVK>{
AVK>    new { Key = "one", Value = 1 },
AVK>    new { Key = "two", Value = 2 },
AVK>    new { Key = "three", Value = 3 }
AVK>};
AVK>


...

Вот нарыл как можно:
var scoreRecords = new [] { new {Name = "Alice", Score = 50},
                                                        new {Name = "Bob"  , Score = 40},
                                                        new {Name = "Cathy", Score = 45}
                                                };

var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);

Console.WriteLine("Bob's score: {0}", scoreRecordsDict["Bob"]);

Так что возможно все.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.