tag:blogger.com,1999:blog-1968777209535947779.post1347513078362819318..comments2024-03-12T00:48:04.770+02:00Comments on Блог Александра Кондуфорова: Методы оптимизации производительности Linq to SQL и Entity FrameworkАлександр Кондуфоровhttp://www.blogger.com/profile/03000892844767433158noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-1968777209535947779.post-45908814000341627462010-05-10T11:43:14.940+03:002010-05-10T11:43:14.940+03:00Eсли вы используете ORM, то по сути он уже являетс...Eсли вы используете ORM, то по сути он уже является полноценным слоем доступа к данным, поэтому дополнительного DAL лепить не нужно. Другой вопртос, что рабоать напрямую с DataContext не всегда удобно, а с точки зрения уменьшения связанности - еще и неправильно. Поэтому и делают промежуточный слой между BL и ORM, который помогает в известной мере абстрагироваться от ORM.<br /><br />Я бы посоветовал вам глянуть на паттерн Repository и реализовать его как промежуточное звено между вашим BL и DAL (Entity Framework). В этом случае вы выставляете наружу в BL методы типа IQueryable GetAll() и можете настраивать необходимые фильтрации и сортировки в BL.<br /><br />Почитать можно тут:<br />http://habrahabr.ru/blogs/net/52173/ (L2S пример, но разницы особой нет)<br />И еще погуглите - полезной информации выше крыши.<br /><br />По поводу написания запросов в BL - не вижу в этом ничего плохого. Это же LINQ - вы просто работаете с коллекцией полученных из DAL объектов. А то, что при использовании IQueryable как возвращаемого значения вы еще получаете бонус в виде оптимизации запросов при фильтрации и пейджинге - так что ж здесь плохого :)Александр Кондуфоровhttps://www.blogger.com/profile/03000892844767433158noreply@blogger.comtag:blogger.com,1999:blog-1968777209535947779.post-8796446765558745812010-05-01T00:41:04.842+03:002010-05-01T00:41:04.842+03:00отличная статья))) Подскажите, я сейчас делаю так:...отличная статья))) Подскажите, я сейчас делаю так: в DAL создаю интерфейсы с требуемыми методами, в методах реализую запросы с помощью EF, и бизнес логика общается с этими интерфейсами, т.е. нет связанности, но с другой стороны больше кода. Как лучше? Но что то рука не не поднимается писать в BL запросы)))Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1968777209535947779.post-68741969636739457072010-03-04T13:51:15.792+02:002010-03-04T13:51:15.792+02:00Да, конечно. Если у вас реализованы какие-то насле...Да, конечно. Если у вас реализованы какие-то наследования, то в базе данных они, как правило, тоже выражены несколькими таблицами. Поэтому EF приходится для получения этих данных джойнить таблицы в запросах. Результат, конечно же, не всегда оптимален, так как его генерирует машина, а не человек, да и делает она это для общего случая, не ведая об оптимизациях. Но несмотря на монстроидальность запросов в них бОльшая часть - это наборы полей в SELECT, поэтому запросы часто выполняются довольно шустро. Если же у вас получаются какие-то совсем неудобоваримые запросы, то вариантов решения четыре:<br /><br />1) если модель очень сложная (много TPH и других сценариев), то лучше ее упростить, убрав ненужные наследования - поможет во всех сценариях в будущем<br />2) поиграться с тяжелыми LINQ запросами, переписав их более оптимальным образом, это может повлиять на SQL код, который генерирует ORM<br />3) посмотреть планы выполнения тяжелых запросов, и натыкать индексов для оптимизации - весьма действенно<br />4) в критических узких местах отказаться от LINQ-запросов, а возможно даже и EF, используя старый-добрый ADO.NET и хранимые процедуры - в конце-концов закон Парето (80/20) действует и здесь, и ORM не могут оптимально решать все 100% задач <br /><br />Других нормальных вариантов нет. Разве что можно еще попробовать перейти на более легковесный ORM. Но тогда вам скорее всего придется попрощаться с наследованием и некоторыми другими плюшками. Выбирать вам.Александр Кондуфоровhttps://www.blogger.com/profile/03000892844767433158noreply@blogger.comtag:blogger.com,1999:blog-1968777209535947779.post-39733966729145219112010-03-04T12:03:14.269+02:002010-03-04T12:03:14.269+02:00Скажите, а вы сталкивались с проблемой что когда у...Скажите, а вы сталкивались с проблемой что когда у вас классы модели имеют иерархию и потом вы пишете linq-запрос, то EF генерируее просто монстроидальные запросы с кучей каких-то объединений и соединений не нужных. Пробовал на EF 4 - стало лучше, но тоже плохо. Боролись с этим?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1968777209535947779.post-84423085769025541752009-04-02T16:53:00.000+03:002009-04-02T16:53:00.000+03:00Отличная статья, изложенная профессиональным, но н...Отличная статья, изложенная профессиональным, но не сухим языком.<BR/><BR/>Спасибо, что решили поделиться опытом. Хороших статей по EF даже сейчас не так много.Anonymousnoreply@blogger.com