Re[29]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.06.14 10:31
Оценка: 2 (1) +1
Здравствуйте, Sinix, Вы писали:

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


G>>Как обычно все немного сложнее. Процедуры компилируются в момент первого вызова, причем с учетом параметров, которые передали в процедуру. План, оптимальный для этих параметров, может быть крайне неоптимальным для других. При вызове sqlcommand с параметрами запрос попадает в sp_executesql, где принудительно параметизуется. Таким образом для linq запросов создается план который работает одинаково (хорошо или плохо — зависит от кучи факторов), а для хранимок может быть закеширован план, который работает хорошо на одном значении параметра и ужасно на другом.


S>Так, я всё-таки торможу


S>Для хранимок:

S> план строится по первому запуску, строится по переданным аргументам, кэшируется до выпадения из кэша.

S>Для параметризованного sql (sp_executesql):

S> план строится по первому запуску, строится по переданным аргументам, кэшируется до выпадения из кэша.

S> * про авто-параметризацию пока забудем, считаем что в executesql пришёл запрос с явно прописанными параметрами.


S>В чём разница?


Опять все немного сложнее. если внутри процедуры обычный select, то разницы нет. Но часто в процедуре много действий, которые делают план очень нестабильным (в разных случаях оптимальный путь исполнения будет сильно отличаться). В sp_executesql всегда прилетает один запрос (при использовании linq), для которого почти всегда можно построить стабильный план (особенно за счет добавления покрывающих индексов), что чаще всего и происходит.


S> http://www.sqlskills.com/blogs/kimberly/exec-and-sp_executesql-how-are-they-different/

Хороший пример, только на linq сложно такой запрос сгенерить.
Re[13]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 10:45
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Alexander Polyakov, Вы писали:


AP>>Вот ссылки по этой теме на официальных представителей разработчиков технологии linq

AP>>http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
AP>>http://msdn.microsoft.com/en-us/library/bb882637.aspx
AP>>http://social.msdn.microsoft.com/Forums/en-US/ca7984af-6444-453f-803d-26c889dea84c/dynamic-sql-and-linq?forum=linqprojectgeneral
AP>>Т.е. либо склейка строк, либо старый добрый Query Object паттерн.
G>Первая ссылка — 2008 год
G>Вторая — как с et работать, написанная тоже году в 2008.
G>Третья — 2007 год
G>Проснись, сейчас 2014 год.
В плане linq спецификация C# с тех пор не менялась, а описанная проблема завязана именно на язык.
Re[14]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.06.14 10:52
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

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


G>>Здравствуйте, Alexander Polyakov, Вы писали:


AP>>>Вот ссылки по этой теме на официальных представителей разработчиков технологии linq

AP>>>http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
AP>>>http://msdn.microsoft.com/en-us/library/bb882637.aspx
AP>>>http://social.msdn.microsoft.com/Forums/en-US/ca7984af-6444-453f-803d-26c889dea84c/dynamic-sql-and-linq?forum=linqprojectgeneral
AP>>>Т.е. либо склейка строк, либо старый добрый Query Object паттерн.
G>>Первая ссылка — 2008 год
G>>Вторая — как с et работать, написанная тоже году в 2008.
G>>Третья — 2007 год
G>>Проснись, сейчас 2014 год.
AP>В плане linq спецификация C# с тех пор не менялась, а описанная проблема завязана именно на язык.

Ты же говоришь о решении, а не о проблеме, думаешь за 7 лет ничего не изменилось?
Re[30]: Entity Framework за! и против!
От: Sinix  
Дата: 27.06.14 10:54
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Опять все немного сложнее. если внутри процедуры обычный select, то разницы нет. Но часто в процедуре много действий, которые делают план очень нестабильным (в разных случаях оптимальный путь исполнения будет сильно отличаться).

Угу, с таким объяснением согласен. Спасибо!
Re[14]: Entity Framework за! и против!
От: IB Австрия http://rsdn.ru
Дата: 27.06.14 15:18
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Это ты уверяешь что проблемы есть, но примеры не приводишь. Воистину — вера страшная штука.

Главное, что моя вера совпадает с верой разработчиков, так что мое кун-фу круче =)

G>Судя по тому что ты пишешь — нет.

Ты видимо что-то не то читаешь..

G>А атрибуты не добавляют? Такие же классы, также через них маппинг делется.

Не прикидывайся. Если не понятно, можешь еще раз прочитать пресс-релиз о причинах закрытия EF6 или почитать текст исключения при попытках составить не тривиальный linq запрос... Очень показательно, кстати, выдает что-то типа "внутренняя модель так не может". Это при том что code-first и прямой маппинг, и никакой такой модели не видно — нет никакой ложки.

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

Если ты не понимаешь, что корни всех конкретных проблем лежат именно в идеологии, то я тут бессилен. При кривой изначальной идее можно заткнуть конкретную проблему.. Одну, может две. Но что-то отвалится в другом месте. А при попытке добавить новый функционал — совсем все развалится.
Что, собственно, с EF и произошло — очень наглядный пример, что кривую идеологию никакая реализация не исправит.

G>Не похоронили, а наконец собрались переписать.

Что в лоб, что полбу =)

G>Текущая версия отлично работает для тех сценариев, для которых она заточена.

Она заточена под несуществующие сценарии и совсем не работает в реальной жизни — there are many seldom used features and capabilities in the code base that hamper performance and complicate development. Или вот — We also have a number of unintuitive behaviors that are engrained into the framework.

G>С точки зрения API в новой версии мало что изменится, будет вполне нормальный upgrade path.

Свежо придание )
Мы уже победили, просто это еще не так заметно...
Re[15]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.06.14 16:58
Оценка:
Здравствуйте, IB, Вы писали:

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


G>>Это ты уверяешь что проблемы есть, но примеры не приводишь. Воистину — вера страшная штука.

IB>Главное, что моя вера совпадает с верой разработчиков, так что мое кун-фу круче =)
Тем не менее твоя вера расходится с фактами. Как бы тебе не верилось обратное.

G>>Судя по тому что ты пишешь — нет.

IB>Ты видимо что-то не то читаешь..
Ты же ни одного факта не привел, а религиозный бред уже фильтрую не задумываясь.

G>>А атрибуты не добавляют? Такие же классы, также через них маппинг делется.

IB>Не прикидывайся. Если не понятно, можешь еще раз прочитать пресс-релиз о причинах закрытия EF6 или почитать текст исключения при попытках составить не тривиальный linq запрос... Очень показательно, кстати, выдает что-то типа "внутренняя модель так не может". Это при том что code-first и прямой маппинг, и никакой такой модели не видно — нет никакой ложки.
Так приведи запрос который не может осилить ef в принципе, но легко осиливается другим linq провайдером.
Или ты оцениваешь технологии исключительно о пресс-релизам? Это верх профессионализма сейчас?


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

IB>Если ты не понимаешь, что корни всех конкретных проблем лежат именно в идеологии, то я тут бессилен.
Ну естественно бессилен, ибо ты веришь, а я проверяю. Попробуй тоже проверить, сразу развенчаешь свои заблуждения.

IB>При кривой изначальной идее можно заткнуть конкретную проблему.. Одну, может две. Но что-то отвалится в другом месте. А при попытке добавить новый функционал — совсем все развалится.

IB>Что, собственно, с EF и произошло — очень наглядный пример, что кривую идеологию никакая реализация не исправит.
Опять идеологическая чушь. Почему-то при кривой идеологии чуваки смогли прикрутить к ef кучу фич, тип асинхронности, code-first, миграций, повысили быстродействие на порядки, создали community с кучей расширений и провайдеров. Дай бог каждому такие «кривые» идеи придумывать.

G>>Не похоронили, а наконец собрались переписать.

IB>Что в лоб, что полбу =)
То есть roslyn == похоронили c#, asp.net vnext == похоронили asp.net, любой мажорный релиз продукта == похоронили продукт?
Отличная логика

G>>Текущая версия отлично работает для тех сценариев, для которых она заточена.

IB>Она заточена под несуществующие сценарии и совсем не работает в реальной жизни — there are many seldom used features and capabilities in the code base that hamper performance and complicate development. Или вот — We also have a number of unintuitive behaviors that are engrained into the framework.
Я уже понял что ты технологии по пресс-релизам оцениваешь. Можешь не повторять.

G>>С точки зрения API в новой версии мало что изменится, будет вполне нормальный upgrade path.

IB>Свежо придание )
Я бы мог тебе рассказать как прекрасно database-first из 4.1 мигрировался на code-first в 6, но чувствую вера твоя все равно сильнее.

Короче изучи чтонибудь кроме пресс-релизов.
Re[13]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 17:11
Оценка:
НС>
НС>private static Expression<Func<int, bool>> MyMethod(int c1, int c2)
НС>{
НС>    return x => x > c1 && x < c2;
НС>}
НС>

А полный код примера с вызовом MyMethod?
Re[15]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 17:18
Оценка:
G>Ты же говоришь о решении, а не о проблеме, думаешь за 7 лет ничего не изменилось?
Поменялось, у меня за окном деревья подросли. Но, к сожалению, на механизм декомпозиции эекспрешенов это не повлияло.
Re[15]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 27.06.14 17:38
Оценка: +1
Здравствуйте, IB, Вы писали:

IB>Она заточена под несуществующие сценарии и совсем не работает в реальной жизни — there are many seldom used features and capabilities in the code base that hamper performance and complicate development. Или вот — We also have a number of unintuitive behaviors that are engrained into the framework.


Что же они так? Спросили бы меня как надо было делать EF с самого начала. Я бы им ещё лет 5 назад рассказал. Стоило выпускать 6 релизов, чтобы понять, что 7-й нужно переписывать с нуля.
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.06.14 18:06
Оценка: -2
Здравствуйте, IT, Вы писали:

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


IB>>Она заточена под несуществующие сценарии и совсем не работает в реальной жизни — there are many seldom used features and capabilities in the code base that hamper performance and complicate development. Или вот — We also have a number of unintuitive behaviors that are engrained into the framework.


IT>Что же они так? Спросили бы меня как надо было делать EF с самого начала. Я бы им ещё лет 5 назад рассказал. Стоило выпускать 6 релизов, чтобы понять, что 7-й нужно переписывать с нуля.


В .NET дофига компонент, которые лет 5 назад стоило переписать с нуля, но менеджмент видимо не позволял.

С появлением Roslyn и K Runtime перепишут под шумок кучу всего.
Re[14]: Entity Framework за! и против!
От: Ночной Смотрящий Россия  
Дата: 27.06.14 18:10
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>А полный код примера с вызовом MyMethod?


Решается несложным хелпером:
ints
    .WhereOr(MyMethod(x, c1, c2))
    .WhereOr(x => x > c3 && x < c4);


Но можно и немножко похитрее, в более общем виде. linq2db.
ints.Where(x => MyMethod(x, c1, c2) || (x > c3 && x < c4));

...

[ExpressionMethod("MyMethodExpr")]
private static bool MyMethod(int x, int c1, int c2)
{
    return (x > c1 && x < c2);
}

private static Expression<Func<int, int, int, bool>> MyMethodExpr()
{
    return (x, c1, c2) => x > c1 && x < c2;
}


Такой вариант, помимо прочего, позволяет декомпозировать куски кода, возвращающе не IQueryable, а скалярные значения.
Re[17]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 27.06.14 18:41
Оценка: +3 :)
Здравствуйте, gandjustas, Вы писали:

IT>>Что же они так? Спросили бы меня как надо было делать EF с самого начала. Я бы им ещё лет 5 назад рассказал. Стоило выпускать 6 релизов, чтобы понять, что 7-й нужно переписывать с нуля.


G>В .NET дофига компонент, которые лет 5 назад стоило переписать с нуля, но менеджмент видимо не позволял.


EF — это всё же отдельно от всего лежащий кусок кала. Ваня правильнос сказал, что практикующим девелоперам ещё лет 10 назад стало понятно каким должно быть средство работы с БД. Но команда EF шла на пролом своим путём.

G>С появлением Roslyn и K Runtime перепишут под шумок кучу всего.


Новый компилятор позволяет переписать устаревший код и сделать его лучше. Но новый компилятор не поможет сделать лучше новую архитектуру. После прочтения их пресс-релиза у меня уже возникают какие-то смутные сомнения. Особенно по поводу "EF7 is Lightweight and Extensible". Один из самых "Extensible" продуктов MS — WCF, хрень, с которой без гугля работать невозможно в принципе. Куда заведут ребят из команды EF новые возможности Рослина не знает никто.
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 19:51
Оценка:
НС>Решается несложным хелпером:
Т.е. всю красоту синтаксиса linq теряем и видим старый неуклюжий Query Object паттерн. Query Object-ов написано куча и на C# и на Java, и все они говно.

НС>Но можно и немножко похитрее, в более общем виде. linq2db.

Т.е. из коробки от Microsoft такого нет. О чем я и говорил, не дизайнился linq для динамических запросов.

Убого это всё выглядит MyMethod, MyMehodExpr, да еще атрибутом надо пометить, фу, простейший Extract Method такой громоздкое убожество вызывает. И это для простоты сопровождения говорите, ну ну. И это вы называли "развитые" средства декомпозиции?

Если сделаю MyMehod и ничего больше писать не буду, то упадет это всё отнюдь не при компиляции, а как раз в рантайме. За что боролись на то и напоролись.

Короче, слишком дорого обходится статическая проверка запросов. Хочется того же, но подешевле.

И еще, из официального показа EF от May 14, 2014:
http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B417#fbid=

Опа, неожиданно sql строка...
Re[3]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 20:13
Оценка:
НС>Давай на конкретных примерах. Перепиши с идентичным поведением и полным сохранением контроля компилятора этот примитивный код без ORM:
А что такое ORM? Вот этот код без ORM:
        private static void Example1(DateTime? date)
        {
            using (var connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    var builder = new StringBuilder(@"
SELECT  Id, CreationDate
FROM    Post
WHERE   1 = 1");
                    if (date.HasValue)
                    {
                        builder.Append(@"
        AND CreationDate >= @Date");
                        command.Parameters.AddWithValue("@Date", date);
                    }
                    command.CommandText = builder.ToString();
                    using (var reader = command.ExecuteReader())
                    {
                        var idOrdinal = reader.GetOrdinal("Id");
                        var creationDateOrdinal = reader.GetOrdinal("CreationDate");
                        while (reader.Read())
                        {
                            var id = reader.GetInt32(idOrdinal);
                            var creationDate = reader.GetDateTime(creationDateOrdinal);
                        }
                    }
                }
            }
        }


Теперь пары Пары [id, Int32] и [CreationDate, DateTime] представляем в виде интерфейса:
public interface IPostInfo
{
    int Id { get; }
    DateTime CreationDate { get; }
}

Тогда, используя runtime кодогенерацию (Emit), код можно переписать следующим образом.
        private static void Example1(DateTime? date)
        {
            using (var connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    var builder = new StringBuilder(@"
SELECT  Id, CreationDate
FROM    Post
WHERE   1 = 1");
                    if (date.HasValue)
                    {
                        builder.Append(@"
        AND CreationDate >= @Date");
                        command.Parameters.AddWithValue("@Date", date);
                    }
                    command.CommandText = builder.ToString();
                    using (var reader = command.ExecuteReader())
                    {
                        var ordinals = reader.GetOrdinals<IPostInfo>();
                        while (reader.Read())
                        {
                            IPostInfo postInfo = ordinals.Materialize(reader);
                        }
                    }
                }
            }
        }

У нас появилась ORM или еще нет?
Re[16]: Entity Framework за! и против!
От: Ночной Смотрящий Россия  
Дата: 27.06.14 20:22
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

НС>>Решается несложным хелпером:

AP>Т.е. всю красоту синтаксиса linq теряем

Нет. Контроль компилятора остается ровно тот же.

AP> и видим старый неуклюжий Query Object паттерн.


Тебе показалось.

НС>>Но можно и немножко похитрее, в более общем виде. linq2db.

AP>Т.е. из коробки от Microsoft такого нет

И что?

AP>Убого это всё выглядит MyMethod, MyMehodExpr


Если сравнивать со склейкой строк ...
Re[4]: Entity Framework за! и против!
От: Ночной Смотрящий Россия  
Дата: 27.06.14 20:22
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>А что такое ORM? Вот этот код без ORM:


Смысл твоих вопросов и их связь с моим постом непонятна.
Re[17]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 20:31
Оценка:
AP>>Т.е. всю красоту синтаксиса linq теряем
НС>Нет. Контроль компилятора остается ровно тот же.
AP>> и видим старый неуклюжий Query Object паттерн.
НС>Тебе показалось.
Query Object тоже дает проверку во время компиляции. Из последнего http://www.jooq.org/

НС>>>Но можно и немножко похитрее, в более общем виде. linq2db.

AP>>Т.е. из коробки от Microsoft такого нет
НС>И что?
А то, что linq не разрабатывался для динамических запросов к БД, а вы это преподносите как главную фичу.

AP>>Убого это всё выглядит MyMethod, MyMehodExpr

НС>Если сравнивать со склейкой строк ...
Если строки автоматически проверяются, то строки проще читать, сопровождать и т.д.
Re[18]: Entity Framework за! и против!
От: Ночной Смотрящий Россия  
Дата: 27.06.14 20:33
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>А то, что linq не разрабатывался для динамических запросов


Заладил как истукан. Это все ни о чем. Есть конкретные задачи и есть их решения.
Re[5]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 27.06.14 20:36
Оценка:
НС>Смысл твоих вопросов и их связь с моим постом непонятна.
У тебя написано "без ORM". Вот я и хочу выяснить смысл этого слова у тебя. Если метод "ordinals.Materialize(reader)" еще не является ORM-ом, то на твой вопрос можно ответить и переписать твой код без ORM.
Re[6]: Entity Framework за! и против!
От: Ночной Смотрящий Россия  
Дата: 27.06.14 20:40
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

НС>>Смысл твоих вопросов и их связь с моим постом непонятна.

AP>У тебя написано "без ORM". Вот я и хочу выяснить смысл этого слова у тебя.

Попробуй воспользоваться википедией: http://en.wikipedia.org/wiki/Object-relational_mapping

AP>Если метод "ordinals.Materialize(reader)" еще не является ORM-ом,


Вообще то уже является.

AP> то на твой вопрос можно ответить и переписать твой код без ORM.


Перепиши.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.