Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, gandjustas, Вы писали:
НС>>>Да не особо. Приведенные тобой примере это точно не доказывают.
G>>Ты везде сводишь к тому, что можно написать свои функции и потом их както мапить. Вот только с ranking function ничего хорошего не получается, увы.
НС>Почему?
Потому что надо внутри select генерировать order by и ROWS clause. Это будет аццкий монстр в виде linq.
G>>В линке нет готовых средств для обхода деревьев
НС>В линке вообще нет готовых средств. Средства предоставляют конкретные провайдеры.
После этого ты утверждаешь что linq выразительнее?
G>>3) Все пляски с Expression Trees и linq-comprehensions сделаны только для трансляции запросов в SQL. В других языках есть query comprehensions, которые гораздо лаконичнее с такой же выразительной силой.
НС>Это Мейер говорил? Ты точно в этом уверен? Потому что когда я с ним разговаривал, он говорил совсем иное.
Нет, это по факту. С момента появления linq прошло более 5 лет, но до сих пор кроме трансляции в SQL достойных применений у ET практически нет.
G>>У тебя есть возражения?
НС>Не не не. Ты давай расскажи, где это Мейер рассказывал что выразительность у линка меньше, чем у SQL.
Я не говорил что Мейер это рассказывал.
G>>Во-первых внутри ET можно написать любое выражение языка, например создание несериализуемых объектов.
НС>Это мелочь. Проблема не в этом. А вот то что легко написать GroupBy, который придется транслировать в килограмм запрросов — вот это уже конкретная проблема выразительности SQL.
И ниже ты пишешь что linq не работает с последовательностями.
G>> Во-вторых linq работает с последовательностям
НС>Это — в корне неверно. Последовательности для линка — лишь частный случай. И даже в рамках последовательностей — у линка свойство элемента последовательности легко и логично может быть последовательностью. А вот у SQL с этим совсем не все так просто.
Мы сейчас говорим об IQueryable<T>, который наследует IEnumerable<T>, который, внезнапно, обозначает последовательность. Так вот GroupBy, возвращает специальный вид последовательности — IGrouping, а SQL не знает о таком, у него на выходе всегда реляция (таблица). Но это совершенно не значит, что SQL обладает меньшей мощностью, он умудряется без специальных типов последовательностей реализовывать то же самое. Только для этого используются как раз ranking fucntions, которые ни один провайдер не поддерживает.
Повторяю еще раз чтобы ты понял — в Linq придуман специальный тип последовательности, когда SQL обходится несколькими дополнительными функциями.
G>>, а SQL с множествами, разница в семантике делает многие linq выражения бессмысленными в SQL. Но оба эих факта никаким образом не связаны с выразительной силой.
НС>Это ты так думаешь. А на самом деле это прямое следствие большей выразительности линка.
То есть обосновать ты не можешь.
G>>Фактически выразительная сила — возможность получить больше результатов выражений, используя меньше кода.
НС>Угу. И уже одна возможность не писать в линке большую часть джойнов вполне себе наглядно демонстрирует, какой из языков выразительнее.
О да, неявное вписывание left join по ключу это конечно выразительной силы добавляет. Это наверное единственное преимущество выразительности linq перед sql.
НС>А если к тому добавить убогость и громоздкость CTE по сравнению с простейшими способами декомпозиции в линке, то я вообще не понимаю как можно не видеть очевидного.
Тем не менее CTE позволят делать рекурсивные запросы, а linq нет. И даже хорошего синтакиса для рекурсивных запросов в linq нету.
НС>Скажи, кстати, а зачем приделали возможность писать хранимки на дотнете? Это тоже от очень большой выразительности SQL?
Нет, это от неумения пользоваться SQL. Кстати крайне не рекомендуется делать CLR-хранимки для выборки данных