Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Подскажите, как вы терпите эти слооожные вложенные запросы с десятками полей с маловразумительными названиями полей и декартовыми произведениями, которые на выходе из 10 тысяч строк получают 10 строк ?

Много людей носят EF на руках и пропагандируют. И кто-то попадается в их сети. Попадаются на фразы, встреченные в айтишных журналах "попробуй, первый раз бесплатно и будет приятно писать код". А потом прикручивают это к серьезному проекту и затем уже страдают не в силах вырваться из этой пагубной привычки (я все еще про EF пишу), т.к. это потребует переписывания большого куска программы.

Как вы оптимизируете получающиеся запросы? Когда пользователь жалуется на медленный запрос, вы ловите его с поличпрофайлером и затем вдууумчиво разлядываете запросы со вложенностью 10, пытаясь понять что же тут тормозит.

Как ?
6 дек 18, 14:15    [21755813]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20821
EF в первую очередь предназначен для простой работы (CRUD) с одной записью (+связанные записи из других таблиц) или простыми списками. Зачастую это 90% (а то и 100%) необходимости для бизнес-приложения.

Если у тебя бизнес-задачи сводятся к каким-то мощным долгим запросам - значит EF не для тебя
6 дек 18, 15:01    [21755891]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Shocker.Pro,

Запросы со сложной вложенностью можно легко получить где угодно. Например, найти всех User'ов у которых выполняется условие - найти все их документы, к которыми связанны договоры и даты этих договоров находятся в периоде от и до. Такой просто запрос запросто сгенерит проблемный запрос и выдаст тысяч 10 строк, из которых EF соберет всего 10.
И что, вы предлагаете отказаться от использования EF везде где могут встретится такие ситуации ? Полагаю это 100% приложений.
А значит EF не пригоден везде, кроме как студенческом проекте.

Иногда мне кажется проще тянуть данные в C# и там уже ручками их обрабатывать, чем получить сложный запрос и потом страдать при его отладке и поддержке.
Но вот я и спрашиваю как другие с этим справляются.
6 дек 18, 15:13    [21755913]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20821
WaspNewCore
Например, найти всех User'ов у которых выполняется условие - найти все их документы, к которыми связанны договоры и даты этих договоров находятся в периоде от и до. Такой просто запрос запросто сгенерит проблемный запрос и выдаст тысяч 10 строк, из которых EF соберет всего 10.
Не вижу, где бы мог тут затупить EF. Но по самому изложению задачи видно, что скорее всего автор пытается искать пользователей, в то время, как нужно искать договоры ))

Вообще, у людей при переходе с SQL на EF наблюдается сильная ломка - это давно замечено и я сам через это проходил. Потом проходит. Да, SQL предоставляет бОльший контроль, а EF большее удобство.
Просто нужно немножко мыслить категориями EF и со временем всё наладится. Картинка с другого сайта.
6 дек 18, 15:21    [21755933]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
fkthat
Member

Откуда:
Сообщений: 1614
WaspNewCore
Такой просто запрос запросто сгенерит проблемный запрос и выдаст тысяч 10 строк, из которых EF соберет всего 10.


Я когда-то работал с одним чудиком, который упорно считал, что EF тянет всю таблицу в виде коллекции объектов, а потом только их фильтрует и т.п.
6 дек 18, 15:36    [21755960]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Shocker.Pro,

Ну погодите. типичная же ситуация ). "Найди ка мне всех раздолбаев, которые назаключали договоры 31-го дкабря и 1-го января. Они очевидно были выпимши, я хочу их наказать". Такая простая задача уже сделает запрос с 3мя вложенностями куда EF вставит десятки полей с именами А1, A2 и т.д.

И вложенность может быть в итоге и еще больше - можно еще подтянуть всех customer'ов, привязанных в договоре А ТАКЖЕ их контакты, чтобы принести им извинения по телефону. И вот, имеем вложенность 5 ! И десятки малочитабельных полей и декартовы произведения из десятков тысяч сущностей.

И вот потом как это все отлаживать или профилировать, не ясно вообще. Такие сложные запросы это проза жизни разработчика EF. Большинство запросов, выходящих за простенький CRUD вылезают в это. Это не какая-то редкость. Это норма.
6 дек 18, 15:39    [21755964]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
fkthat,

ну видимо он не знал про отложенное выполнение и путал iQueriable и iEnumerable )
Я то не про это говорю вообще )
6 дек 18, 15:40    [21755965]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Shocker.Pro,

Итоговый, стандартный запрос.
"Найди ка мне всех раздолбаев, которые назаключали договоры 31-го дкабря и 1-го января. Также всех customer'ов, привязанных к этим договорам и их контакты НЕ помеченные как НЕ ЗВОНИТЬ и которым мы еще никогда не звонили (что хранится в виде истории, в другой таблице)" Как вам такой просто запрос на человеческом языке, которые сгенерит кашу в EF ? :)
6 дек 18, 15:52    [21755984]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
fkthat
Member

Откуда:
Сообщений: 1614
WaspNewCore
Shocker.Pro,

Итоговый, стандартный запрос.
"Найди ка мне всех раздолбаев, которые назаключали договоры 31-го дкабря и 1-го января. Также всех customer'ов, привязанных к этим договорам и их контакты НЕ помеченные как НЕ ЗВОНИТЬ и которым мы еще никогда не звонили (что хранится в виде истории, в другой таблице)" Как вам такой просто запрос на человеческом языке, которые сгенерит кашу в EF ? :)


А какая разница, что он там сгенерит? Все равно, если проблемы со скоростью запроса, то план выполнения надо смотреть, а не сам запрос.
6 дек 18, 16:28    [21756066]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
fkthat,

проблема в том, что там я сам не понимаю что он сгенерил.
Особенно EF любит делать все через Union.

Он может запросто взять этот сложный запрос, описанный мной и обединить его так:

............................. очень много фигниииии.................
................................. ну ооооооочень много...................
.............. поля, поля, круком поля F1, F2, A1, какие только хочешь
..................... where x != 1
...... а тут еще больше полей, чтобы было интересней
...... аааа и тут тоже.
.... и здеся

union


............................. очень много фигниииии.................
................................. ну ооооооочень много...................
.............. поля, поля, круком поля F1, F2, A1, какие только хочешь
..................... where x != 2 OR where x > 3
...... а тут еще больше полей, чтобы было интересней
...... аааа и тут тоже.
.... и здеся


И вот ты такой смотришь на этот чертов запрос и охреневаешь ! 500 строк склеивается с еще 500тами и разница между ними в 5 символах. В 5ти символах Карл ! А рядом стоит юзер и ругается, что у него отчет не генерится, потому, что соединение отваливается по таймауту и мне нужно найти где проблема и что тормозит. Но для начала все таки понять что делает запрос.

Вот как разработчики EF с этим живут, справляются и не спиваются ?
6 дек 18, 16:37    [21756082]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
fkthat
Member

Откуда:
Сообщений: 1614
WaspNewCore
проблема в том, что там я сам не понимаю что он сгенерил.


На самом деле, пример задачи, что ты привел, он совсем не для OLTP приложения. По уму, под такие запросы надо вообще проектировать отдельную OLAP-херь, где и сама БД будет совсем по другим принципам и схеме построена.

А вообще, EF так-то позволяет и текстом запросы писать, и хранимки вызывать, если надо.
6 дек 18, 16:45    [21756096]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
fkthat,

Ну что вы такое говорите. Для простых запросов из трех (пяти) связанных таблиц, из которых EF делает кашу, городить OLTP.
Этак получится, что нужно делать OLTP Для всего, где может встретится хоть один Join.
6 дек 18, 16:55    [21756117]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
fkthat
Member

Откуда:
Сообщений: 1614
WaspNewCore
fkthat,

Ну что вы такое говорите. Для простых запросов из трех (пяти) связанных таблиц, из которых EF делает кашу, городить OLTP.
Этак получится, что нужно делать OLTP Для всего, где может встретится хоть один Join.


Ну я, чесговоря, с EF работал еще с тех пор когда еще EF и не было (был LINQ 2 SQL). И не могу вспомнить, чтобы на деле надо было что-то сложнее чем "вытащи мне сущность по ID и, возможно пару связанных сущностей". То, что ты привел - это явно задача для какого-то отчета, а для отчетов никто ORM пользоваться и не станет.
6 дек 18, 18:57    [21756272]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
fkthat,

Ну например такой запрос "найди ка мне все коробки с продуктами, отправленными в регион такой-то, и дай мне только те коробки у которых внутри больше 2х банок, но только такие банки, внутри которых желтые помидоры а не красные".
По моему это совершенно простой запрос, который запросто может встретится в любой программе. Но EF, скорее всего, это обернет в чудовищные
from (select A1,A2 from (select B1,B2 from ....))  union from (select A1,A2 from (select B1,B2 from ....))  union....


Как я понимаю, вы считаете, что для такого рода запросов EF не предназначен да ? Тогда для чего предназначен EF, кроме школьных лабораторных, где могут встретится только задачи вида "дай мне все апельсины красного цвета и вес которых не больше 500 грамм".
7 дек 18, 13:28    [21756990]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WebPrj
Member

Откуда:
Сообщений: 376
WaspNewCore,
Поясни, как твой запрос Выше в любой программе вводят?
Диктуют в окошечко?
Извини за юмор)
7 дек 18, 13:51    [21757026]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WebPrj
Member

Откуда:
Сообщений: 376
WaspNewCore,
Покажи где он union генерирует. Вроде не должен.
7 дек 18, 13:55    [21757035]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
WebPrj,

Не могу показать даже сейчас. В последних проектах отказались от EF. Надоело с ним возится, и старых проектов в эксплуатации, с EF уже нет. Но решил создать эту тему, чтобы понять как другие существуют с этим EF, может как-то справляются с этим всем.
Может найду ответы и снова вернусь к EF. Хотя и не очень хочется, но приходится поддерживать какие-то тренды...

Все эти сложные запросы у меня бывали, с юнионами в том числе. Спровоцировать их вполне реально, неужели у пользователей EF такого никогда не было и это я (мы) настолько не умею его готовить ? Не поверю.
7 дек 18, 14:13    [21757061]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WebPrj
Member

Откуда:
Сообщений: 376
WaspNewCore,
Без фактов твой вопрос и топик обречён.
ОРМ не только в шарпе есть.
Биже к коду, коллега)
7 дек 18, 14:21    [21757074]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Я думал все с этим сталкивались, а те кто используют EF и вовсе видят это постоянно, так, что думал не понадобятся живые примеры. Нужно будет не забыть поднят эту тему когда снова буду работать с EF.
7 дек 18, 14:36    [21757094]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
stenford
Member

Откуда: урал
Сообщений: 2766
WaspNewCore
Ну например такой запрос "найди ка мне все коробки с продуктами, отправленными в регион такой-то, и дай мне только те коробки у которых внутри больше 2х банок, но только такие банки, внутри которых желтые помидоры а не красные".
По моему это совершенно простой запрос, который запросто может встретится в любой программе. Но EF, скорее всего, это обернет в чудовищные
from (select A1,A2 from (select B1,B2 from ....))  union from (select A1,A2 from (select B1,B2 from ....))  union....


Как я понимаю, вы считаете, что для такого рода запросов EF не предназначен да ? Тогда для чего предназначен EF, кроме школьных лабораторных, где могут встретится только задачи вида "дай мне все апельсины красного цвета и вес которых не больше 500 грамм".

план созданного в ЕF запроса не будет отличатся от написанного вручную, а если и будет - то зачастую в лучшую сторону. Указанный запрос элементарный, там не будет ничего сложного ни в самом запросе, ни в плане
9 дек 18, 00:40    [21758260]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Все таки хочу уточнить.
Никто не сталкивается с тем, что EF генерит SQL запросы вида
from (select A1,A2 from (select B1,B2 from ....))  union from (select A1,A2 from (select B1,B2 from ....))  union....


Как я написал выше, спровоцировать такой запрос очень просто. Достаточно, чтобы по условии задачи у вас были какие-то логические условия, применяемые к навигационной проперти 4-5го уровня вложенности. Такого не избежать. Точнее можно, но для этого придется тянуть на клиента Ienumerable верхнего уровня и потом через foreach спускаться вниз, но это, очевидно не правильно.

Также я не помню точно, но много раз видел, что EF разбивает условие на два большие фактически идентичные и объединяет их через Union. Ни у кого из вас такого не было ?

Вы предлагаете писать условия по проще, но это означает, что придется написать больше логики на C# с тем чтобы пошагово дозапрашивать необходимые данные. Т.е. обойти сложный запрос сложным алгоритмом кода. Но мне это не нравится. Если взять чистый SQL, то с его помощью я могу создать достаточно эффективный но сложный запрос и он будет вполне читабелен и понимаем при отладке.

Т.е. мы тут имеем выбор:
- пользуйся EF, но делай простые запросы и сложный алгоритм в коде. Фактически вместо eager loading работай с lazy loading реализованным вручную !
- либо не используй EF, и тогда сможешь использовать сколь-угодно сложные и эффективные, читабельные запросы.

Неужели все разработчики EF вынуждены сделать выбор между этими двумя вариантами ? Если нет, то см выше - как вы избегаете сложных запросов.
14 дек 18, 16:26    [21764209]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20821
WaspNewCore
Неужели все разработчики EF вынуждены сделать выбор
Почему обязательно надо делать какой-то выбор? Хочешь написать сложный SQL-запрос - напиши (напрямую, через представление, через табличную функцию, через процедуру) и используй параллельно с обычной работой с entity
14 дек 18, 16:46    [21764227]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Shocker.Pro,

С этим пожалуй могу согласится. Читал в MSDN magazine про какой-то Query Types, который добавили в EF 2.1.
https://msdn.microsoft.com/magazine/mt847184

Сильно не вникал, ибо не практикую EF, но как понял добавлена возможность работать "не с сущностями" получая их из чистого SQL:
context.Authors.FromSql("select authorid,authorname from authors").ToList();


Однако это дна из недавно добавленных фич. Возникает вопрос, как до этого жить и жили программисты ?

Вот вы мне опять предлагаете какие-то обходные пути, чтобы избежать сложного запроса. А я выше как раз и задал вопрос - это что базовое правило ? EF только если нужно получить "документ по ID ну и, может быть, его создателя. Максимум !" ? А если нужно поработать с зависимыми сущностями, то пожалуйста делай 5 вложенных foreach'ей и пиши кучу логику.


Я сталкивался с такими сложными запросами, просто потому, что логика того требовала. Как его избегаете Вы ? А если не избегаете, значит видели эти сложные вложенные запросы с кучей unio'ов, то как вы с этим работали, отлаживали ? Об этом и топик.
14 дек 18, 17:01    [21764238]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
WaspNewCore
Также я не помню точно, но много раз видел, что EF разбивает условие на два большие фактически идентичные и объединяет их через Union. Ни у кого из вас такого не было ?
примеры будут или опять воду в ступе?

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

Где примеры?
14 дек 18, 17:04    [21764243]     Ответить | Цитировать Сообщить модератору
 Re: Тема для анонимной психологической помощи пользующемся EF программистам.  [new]
WaspNewCore
Member

Откуда:
Сообщений: 155
Petro123,

Выше я написал, что у меня нет примеров. Не практикую EF давно, избегаю в проектах.
Но у меня и вопрос к пользователям EF - они что, не видели такого ? Я один это видел ? А весь остальной мир живет в счастливом мире читабельных EF запросов. Я надеялся, что у тех кто практикует EF эти примеры есть прямо сейчас в самых разных вариантах.
И у меня вопрос, как же другие избегают этих запросов ? Как я и написал - через вложенные foreach'и где логика реализуется уже на C# ?
14 дек 18, 17:12    [21764248]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить