Разве Linq to SQL не хватает точки? Не являются ли оптимальные решения ORM-mappers (SubSonic и т.д.)?

Я бы хотел, чтобы сообщество приняло некоторые мысли, которые я имел о Linq для Sql и других ORM-мапперах.

Мне нравится Linq to Sql и идея выразить логику доступа к данным (или CRUD-операции в целом) на вашем родном языке разработки, а не иметь дело с "несоответствием импеданса" между С# и SQL. Например, чтобы вернуть список событий EventDataSource для экземпляров бизнес-уровня, мы используем:

return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })

Если бы я реализовал это с использованием старых конструкций SQL-to-С#, мне пришлось бы создать класс Command, добавить параметр EventID (используя строку для описания аргумента @EventID), добавить SQL-запрос string в класс Command, выполните команду, а затем используйте (cast-type) nwReader [ "FieldName" ], чтобы вытащить каждое возвращаемое значение поля и назначить его члену вновь созданного экземпляра моего класса EventData (yuck).

Итак, вот почему люди любят Linq/SubSonic/etc. и я согласен.

Однако, в большей картине я вижу ряд вещей, которые ошибочны. Я считаю, что Microsoft также видит что-то не так, и именно поэтому они убивают Linq для SQL и пытаются переместить людей в Linq в Entities. Только, я думаю, что Microsoft удваивает ставку по плохой цене.

Итак, что не так?

Проблема в том, что есть архитектура астронавтов, особенно в Microsoft, которые смотрят на Linq на Sql и понимают, что это не истинные данные инструмент управления: есть еще много вещей, которые вы не можете легко сделать с комфортом на С#, и они хотят его исправить. Вы видите, что это проявляется в амбициях Linq to Entities, сообщениях в блоге о революционном характере Linq и даже Задача LinqPad.

И проблема в том, что он предполагает, что проблема SQL является проблемой. То есть, чтобы уменьшить мягкий дискомфорт (несоответствие импеданса между SQL и С#), Microsoft предложила эквивалент космического костюма (полная изоляция), когда ленточная помощь (Linq to SQL или что-то подобное) будет очень хорошей.

Насколько я понимаю, разработчики достаточно умны, чтобы овладеть реляционной моделью, а затем разумно применять ее в своих усилиях по развитию. Фактически, я хотел бы пойти дальше и сказать, что Linq to SQL, SubSonic и т.д. Уже слишком сложны: кривая обучения не сильно отличается от овладения самим SQL. Поскольку в обозримом будущем разработчики должны осваивать SQL и реляционную модель, теперь мы сталкиваемся с изучением двух языков запроса /CRUD. Хуже того, Linq часто трудно тестировать (у вас нет окна запроса), удаляет один слой из реальной работы, которую мы делаем (он генерирует SQL), и имеет очень неуклюжую поддержку (в лучшем случае) для SQL-конструкций, таких как Обработка даты (например, DateDiff), "Наличие" и даже "Группировать по".

Какая альтернатива? Лично мне не нужна другая модель для доступа к данным, например Linq to Entities. Я бы предпочел просто открыть окно в Visual Studio, ввести и проверить мой SQL, а затем нажать кнопку для создания или дополнения класса С# для инкапсуляции вызова. Поскольку вы уже знаете SQL, не хотите ли вы просто ввести что-то вроде этого:

Select EventID, Title From Events Where [email protected]

и в конечном итоге с классом EventData, который A) содержит поля EventID и Title как свойства, а B) имеет метод factory, который принимает строку "Location" в качестве аргумента и генерирует список <EventData> ? Вы должны тщательно подумать об объектной модели (приведенный выше пример, очевидно, не имеет отношения к этому), но фундаментальный подход к использованию SQL при устранении несоответствия импеданса мне очень нравится.

Вопрос в том, я ошибаюсь? Должна ли Microsoft переписать инфраструктуру SQL, чтобы вам больше не нужно изучать управление реляционными данными SQL/реляционными данными? Могут ли они переписать инфраструктуру SQL таким образом? Или вы считаете, что очень тонкий слой поверх SQL для устранения боли при настройке параметров и доступе к полям данных вполне достаточен?

Обновление. Я хотел рекламировать две ссылки на верх, потому что я думаю, что они захватывают важные аспекты того, что мне нужно. Во-первых, CodeMonkey указывает на статью под названием "Вьетнам компьютерных наук" . Для начала нужно немного времени, но это очень интересное чтение. Во-вторых, AnSGri указывает на одного из Джоэла Спольского более заметные части: Закон утечек абстракций, Это не совсем по теме, но оно близко и прекрасно читается.

Обновление 2: я дал "ответ" на ocdecio, хотя здесь есть много отличных ответов, и выбор "правильного" ответа носит чисто субъективный характер. В этом случае его ответ основывается на том, что я считаю действительно лучшей практикой, учитывая нынешнее состояние технологии. Однако это область, которую я полностью ожидаю, чтобы развиваться, поэтому все может измениться. Я хотел бы поблагодарить всех, кто внес свой вклад, я поддержал всех, кто, как я думаю, дал вдумчивый ответ.

Ответ 1

В течение как минимум 6 лет я использую свой собственный ORM, основанный на очень простой концепции: проекции. Каждая таблица проецируется в класс, а SQL генерируется "на лету" на основе определения класса. Мне по-прежнему требуется знание SQL, но он заботится о 90% простой CRUD, и мне никогда не приходилось управлять соединениями и т.д. - и это работает для основных поставщиков БД.

Я доволен тем, что у меня есть, и не нашел ничего достойного для этого.

Ответ 2

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

В качестве грубого обобщения: разработчики не знают SQL. Разработчики действительно не хотят знать SQL. Они могут написать это, они могут создавать таблицы, но это заставляет их чувствовать себя нехорошо. Они имеют тенденцию делать глупые вещи, когда необходимый запрос - это больше, чем простое соединение. Не потому, что разработчики глупы, потому что их не беспокоит. Им нравится жить в мире, где им нужно иметь дело только с одним концептуальным пространством; перемещение из объектов в таблицы и обратно - это контекст, который определяет цену, за которую они не любят платить.

Это не значит, что они плохие или неправильные; это означает, что есть возможность для улучшения. Если ваши клиенты (в этом случае разработчики, использующие вашу фреймворк), не любят SQL и таблицы - дают им слой абстракции, который позволяет им уйти, не имея дело с основным беспорядком.

Это та же логика, что делает сбор мусора/автоматизированное управление памятью большим ударом. Да, разработчики могут справиться с этим; да, они могут писать код, который лучше оптимизирован без него; но не иметь дело с ним, делает их счастливее и продуктивнее.

Ответ 3

Я думаю, что популярность ORM была порождена разработчиками, разрабатывающими слои данных и повторяющими один и тот же код CRUD снова и снова после приложения. ORM - это еще один инструмент/технология, позволяющая разработчикам тратить меньше времени на повторную работу одних и тех же операторов SQL и сосредоточиться на логике приложения (надеюсь).

Ответ 4

IMHO, OR/M - это не только "абстрагирование SQL-кода" или скрытие SQL, либо поддержка нескольких СУБД.

Это позволяет вам больше сосредоточиться на своем проблемном домене, поскольку вам приходится тратить меньше времени на написание скучных CRUD-запросов SQL. С другой стороны, если вы используете хороший OR/M, этот OR/M должен позволить вам писать SQL-запросы, если это кажется необходимым.

OR/M может быть мощным инструментом, если вы используете его правильно; он может заботиться о ленивой загрузке, полиморфных запросах/ассоциатах...
Не поймите меня неправильно; нет ничего плохого в простом SQL, но если вам нужно позаботиться о том, чтобы перевести вашу (хорошо продуманную и нормализованную) реляционную модель в выразительную модель OO/domain, то я думаю, что вы тратите много времени на сантехнику.

Использование OR/M также не означает, что вы, как разработчик, не должны знать SQL. Напротив, верно imho.
Зная SQL и зная, как писать эффективный SQL-запрос, вы сможете использовать OR/M должным образом.

Я также должен признать, что я пишу это с NHibernate. Это OR/M, в котором я использую atm, и я не использовал Linq для SQL или Linq для объектов (пока).

Ответ 5

Конструкция Linq и структура linq для сущностей, безусловно, используются как инструмент orm, но большая идея заключается в том, что она будет использоваться как обычный api для запроса любого источника данных, а не только для РСУБД.

Я помню, как читал, что linq, хотя он, очевидно, разработан с учетом SQL, предназначен для языка запросов для любого хранилища данных. Вы можете писать запросы linq для SQL, но вы также можете теоретически писать запросы linq, которые нацелены на ldap, файловую систему, обмен, веб-службы, бесконечность. Вы не можете использовать SQL для этих программ.

Вам также нужно изучить другой API почти для каждого хранилища данных. Linq дает всем общую цель создания API доступа к данным.

Наблюдается ли это видение или нет, но это идея. Я думаю, что мы хотим, чтобы системы взаимодействовали все больше и больше, мы можем найти очень хорошие приложения для l2e.

Я добавлю некоторые ссылки, если я смогу найти их снова.

http://laribee.com/blog/2007/03/17/linq-to-entities-vs-nhibernate/

Ответ 6

Я согласен на 100%. Многие из них являются результатом того, что навыки процедурного кодирования и навыки кодирования SQL очень разные; и этот факт не получил широкого признания. Таким образом, до тех пор, пока эта реализация не ударит, программисты ищут способы сделать свой набор навыков переведенным из одного домена в другой.

Это не работает.

Вы просто должны научиться фазовому сдвигу: научиться думать о своем коде по-разному в зависимости от того, к какому домену вы обращаетесь.

Кто-нибудь еще заметил, насколько сложнее и сложнее запрос, когда он сопоставлен с SQL в LINQ? Например, во всех онлайн-примерах?

Ответ 7

Вы должны перестать беспокоиться и научиться любить ОРМ. Абстракции, подобные этим, помогут нам сосредоточить наши навыки и сделать успехи в этой области.

Достаточно места, чтобы воспользоваться приобретенными функциональными навыками и применить их в прикладном уровне. Это на самом деле одна из сильных сторон LINQ to SQL по сравнению с другими ORM.

Я могу согласиться только со многими другими комментариями. При сохранении времени вы можете сосредоточиться на уточнении своей модели домена и создании лучшего приложения. И, как только вы определили узкое место, используйте для создания оптимизированного SQL.

Что может быть не сразу очевидным, так это то, что ORM поставляется с рядом функций, которые действительно приятны. Карта идентификации, которая помогает избежать загрузки элементов снова и снова, ленивая загрузка помогает вам выразить домен с меньшим количеством сантехники, а блок работы помогает отслеживать изменения и оптимизировать записи в базе данных.

Ответ 8

Как отметил Dmitriy , разработчики не знают SQL. Точнее, большинство знают SQL, но не понимают его и определенно не любят, поэтому они стремятся искать магическую пулю, создавая спрос на такие вещи, как Linq, чтобы сделать иллюзию (hm, abstraction), которую они наняли не используйте ничего, кроме любимых классов.

Это очень плохо, так как закон протекающих абстракций всегда остается верным.

Некоторые решения ORM являются определенно хорошими (например, JPA/Hibernate), а не потому, что с их помощью вам не нужно беспокоиться о SQL. Фактически, чтобы эффективно использовать JPA, вам нужно очень глубокое понимание БД в целом, в частности, запросов. Хороший момент в том, что они заставляют машину выполнять скучную работу, до такой степени, что она автоматически генерирует всю базу данных.

Linq to SQL, как я думаю, не решает реальной проблемы. Это какая-то другая презентация, не более того. Это может быть хорошо, хотя это слишком усложняет уже сложный язык. С другой стороны, Linq to Objects - очень интересная концепция, потому что это своего рода sql-запрос к коллекциям.

Ответ 9

Историческая перспектива.

Когда Codd et. и др. первоначально разрабатывали теорию и реализацию реляционных баз данных, одна совершенно отдельная проблема: "Как мы запрашиваем эти вещи"? Был предложен ряд стратегий и синтаксисов с различными сильными и слабыми сторонами. Одним из этих кандидатов был SQL (в его ранней форме, очевидно.) Другой был QBE (Query By Example). Я считаю, что другой был назван "quel"; и было несколько других. SQL, безусловно, не стал доминирующим, потому что он был признан лучшим, чем другие. Однако необоснованно другие почти исчезли, к нищете всех нас (потому что они могут использоваться одновременно по тем же данным.)

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

Там есть много мысли и строгости за SQL, и много проверенной временем долговечности. У Microsoft есть определенная история, полагая, что их, по общему признанию, высшая ступень развития организации может выдумать всех нас, включая наши коллективные институциональные воспоминания. Кажется, что это не так часто работает. До тех пор, пока мы привязаны к реляционным хранилищам данных, мы должны дважды подумать о парадигмах абстракции надмножества, которые отталкивают нас от голого металла с promises равной или лучшей производительности.

Ответ 10

Будучи автором проекта ORM самостоятельно, я должен признать, что мой ответ на такой вопрос может быть немного предвзятым. Я уже разработал некоторые свои собственные мысли о ответе перед тем, как прочитать вопрос, поэтому я уже немного привязан.

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

Когда я начал работать над своими инструментами ORM несколько лет назад, концепция была непрактичной на моем предпочтительном языке, большинство людей, с которыми я разговаривал, не понимали, почему я над этим работаю, и некоторые уважаемые голоса в сообществе имели столько же как письменные статьи в торговых журналах о том, что то, что я уже сделал, было не только невозможным, но и нежелательным. Некоторые из тех же причин были даны - он слишком сложный, он ограничивает и добавляет накладные расходы. Сегодня одно и то же сообщество имеет как минимум три популярных инструмента абстракции базы данных (хотя есть некоторые дискуссии об определении термина ORM). Причина, по которой я упоминаю об этом, заключается в том, что, когда я начал работать над этими инструментами, первоначальные возражения несли гораздо больший вес, чем сейчас. Основанная технология и аппаратное и программное обеспечение изменилась за прошедшие годы, чтобы сделать эти инструменты более практичными в долгосрочной перспективе. Моя тенденция состоит в том, чтобы попытаться воспользоваться долгосрочным программным обеспечением и работать над решениями, которые, возможно, не совсем практичны, но скоро это станет практическим. Поэтому, учитывая, что я не буду считать LINQ для Entities хорошим решением для определенных проблем.

Я также предпочитаю больше вариантов, а не меньше. Поэтому, хотя я могу поддержать идею разработки LINQ для Entities, я менее склонен поддерживать убийство LINQ to SQL просто, потому что LINQ to Entities стал доступен. Объекты отлично подходят для того, чтобы делать то, что делают объекты, нет вопроса об этом... В моем (опять-таки предвзятом) мнении возникает проблема в том, что люди видят какую-либо данную парадигму инструмента или программного обеспечения как "волшебную пулю" и хотят настаивать на том, чтобы все должно быть так. Хорошо известно, что реляционная база данных очень хорошо справляется с некоторыми другими задачами, что является хорошим примером. Поэтому, на мой взгляд, это похоже на то, чтобы стрелять в ногу, чтобы настаивать на том, что все должно быть сущностями, потому что тогда вы вынуждаете себя использовать неэффективный инструмент для работы. Поэтому в отношении отчетности, в частности, избавления от LINQ to SQL и использования только LINQ to Entities по крайней мере на поверхности звучит для меня как абстракция инверсии анти-шаблон.

Итак, я думаю, что резюме для моего ответа таково: используйте молоток, если ваша проблема - гвоздь - используйте отвертку, если ваша проблема - винт.

Ответ 11

Утверждение Дмитрия, что Разработчик не любит SQL, может иметь много правды, но решение - это не только ORM. Решение состоит в том, чтобы нанять в составе команды разработчиков DBA развития. В моей компании у моей команды разработки .net есть превосходный Oracle DBA, который абсолютно не занимается производством dba. Его роль в нашей команде - моделирование данных, дизайн физического db, создание хранимых процессов, анализ данных и т.д. Он является причиной того, что наша сторона db настолько чиста и эффективна. Весь наш доступ к БД осуществляется через хранимые процедуры.

Что такое DBA разработки? http://www.simple-talk.com/sql/database-administration/what-use-is-a-development-dba/

Ответ 12

Я думаю, что логика, лежащая в основе этих вещей, заключается в том, что накладные расходы на создание и выполнение SQL-запроса в рамках фреймворка незначительны по сравнению с накладными расходами в других частях системы (например, обратная маршрутизация HTTP-запросов на несколько порядков).

Преимущества - быстрая разработка, запросы, которые соответствуют языку, а не экранированные строки и т.д., часто перевешивают недостатки. Если производительность является проблемой, вы можете оптимизировать ее позже.

Я не думаю, что "не нужно знать SQL" является фактором. Любой достойный разработчик должен знать SQL в какой-то момент своего развития. Идея слоя абстракции базы данных заключается в том, чтобы удалить усилие генерации кода шаблона для запросов к базе данных.

Действительно, в нашей системе в Java я создал утилиту генератора кода, которая занимала аннотированные классы и генерировала полный CRUD API и обрабатывала все эти причудливые вещи, которые вы забираете с течением времени. Намного легче создать вашу модель и аннотировать ее, чем прокручивать, написав DAO. Масштабируйте такой инструмент, и в итоге вы получите LINQ или Hibernate или множество других решений ORM DB.

Ответ 13

Я использую как базу данных, так и распределенное прикладное программирование (веб-и скомпилированные), и считаю, что время, затрачиваемое на разработку уровней доступа к данным на основе хранимых процедур, хорошо потрачено. Лично я предпочитаю моделировать данные и идентифицировать необходимые процессы в начале процесса разработки..., кажется, помогает выявить проблемы с архитектурой/интерфейсом/структурой.

Я не большой поклонник встроенного программирования баз данных (независимо от того, является ли код sql вручную или машиной). Я считаю, что база данных является основой одного приложения и что время, затрачиваемое на сохранение кода в ручном коде, имеет смысл.

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

Ответ 14

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

Если вы позволяете объектной модели и ORM диктовать вашу модель данных, вы просто закончите с плохой моделью данных, которая не нормализована и/или содержит артефакты из объектной модели.

1 table = 1 класс - плохая идея.

Начнем с того, что у вас никогда не бывают классы, которые представляют собой таблицы со многими-ко-многим или многие-к-одному. Они соответствуют дочерним коллекциям в объектной модели - сами ссылки не являются объектами.

Если вы обрабатываете свою базу данных в виде таблиц, просто удерживая свои объекты в строках (один общий подход) и предоставляете приложению прямой доступ к таблицам, вы отказываетесь от всех преимуществ определения уровня интерфейса служб баз данных, который может использовать для защиты своего периметра.

ORM имеют свое место, но если вы используете их для простого сохранения ваших объектов, как это было разработано в вашей объектной модели, ваша база данных не будет реляционной базой данных, и она не сможет использоваться как одна для целей ETL, отчетность, рефакторинг и т.д.

Ответ 15

Мне не нравится какое-либо из текущих решений, но я предпочитаю больше выбора за меньший выбор; -)

Я использовал OODBMS в проекте давно, что было самым близким к его правильному (к сожалению, у продукта были некоторые отвратительные ошибки и ужасная техническая поддержка). Перенос объектов был в основном невидим, обрабатывался за кулисами (через препроцессорный код-генератор ) и контролируется очень простым методом "Обновить", "Удалить" и "Найти" и простыми контейнерами.

Мне бы очень хотелось, чтобы это (и, возможно, еще одна модель объектного объекта) уже хорошо, с OCL (Object Constraint Language) в качестве языка запросов на основе нескольких объектов

Ответ 16

Был другой вопрос здесь, в котором спрашивали об ORM в целом. Проверьте это для более подробного обсуждения того, является ли несоответствие импеданса такой же большой сделкой, как и все это.

Ответ 17

Я думаю, что реальное решение, в котором они нуждались, было чем-то более похожим на литерал SQL. VB.Net 9.0 поддерживает XML Literals, которые позволяют вам писать XML прямо в вашем коде и обеспечивать его проверку и соответствие DTD. Аналогично приятной особенностью были бы SQL-литералы, которые позволят вам писать встроенный код SQL в ваш .Net-код и проверять его с помощью IDE. Для проверки информации о базе данных должна быть какая-то архитектура плагина, но это может быть легко написано для популярных движков базы данных. Это обеспечило бы то, что я считаю реальным решением проблемы, которую они пытались решить, не прибегая к субоптимальным решениям.

Ответ 18

Codemonkey делает очень хорошую точку: хранимые процедуры предлагают уровень абстракции, который выполняет некоторые обещания более сложных моделей ORM. На первый взгляд это неинтуитивно, но я могу придумать пример из моего собственного кода. У меня есть "check-in" sproc, который затрагивает почти десяток таблиц (кто имеет этот идентификатор?) У них есть членство? Есть ли какие-нибудь сообщения? Получают ли они очки для этой регистрации? И т.д.).

Моделирование этого в С# - независимо от того, насколько сложна модель данных - никогда не будет хорошей идеей, поскольку это потребует много поездок "по проводу" для проверки данных и обновления различных таблиц. Хотя верно, что вы можете обрабатывать sprocs в Linq или другой ORMS, все, что мне нужно, это класс-оболочка, который позволяет мне вызвать sproc со стандартными параметрами С#. На самом деле, для меня была такая насущная потребность, что я написал генератор кода в T-SQL для создания таких оберток.

Ответ 19

Я должен согласиться с тем, что всплеск инструментов ORM в значительной степени проистекает из раздражения написания SQL, связанного с любым драйвером DB, который вы должны использовать, внутренним абстрагированием между БД (Oracle vs SQL Server, vs независимо от повторного использования кода) и преобразование типов данных.

Идеальное решение? определенно нет! Однако, я думаю, что это итерация в процессе лучшего слияния приложения с хранилищем данных. В конце концов, в большинстве случаев наличие БД без приложения доступа, написанного на любом языке, практически бесполезно. (вы действительно бы просто установили oracle и ожидаете, что все сотрудники будут работать в SQLPlus напрямую?)

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

Для .NET в частности, то, что я бы скорее увидела вместо Linq, является встроенным способом сопоставления определения класса с базовым источником данных в базовом хранилище данных, и все работы сантехники просто работают.

Другими словами, я могу просто сказать "Employee.Name = 'rally25rs"; и свойство объекта изменилось бы, и под ним оно сохранилось бы в самом хранилище данных. Просто полностью удаляйте SQL, вместо того, чтобы идти в 1/2 пути, как Linq to SQL. Теперь

Конечно, такое решение вызывает проблемы с производительностью, обработкой транзакций и т.д.

Может быть, нужно переосмыслить и перестроить всю концепцию языка программирования и реляционной базы данных? По своей сути они представляют собой совершенно раздельные и разрозненные сущности. Возможно, настало время просто отбросить "реляционную базу данных, поддерживающую sql" и построить следующую вещь, потому что выполнение строки кода будет непосредственно работать с базой данных.

Ответ 20

нет проблем с linq, но с теми, кто его использует, и игнорирует, что происходит "за кулисами"

Я по-прежнему предпочитаю, чтобы мои руки были грязными с SQL. По крайней мере, я буду знать, что происходит.

Ответ 22

Большинство людей пропустили важный момент: в большинстве случаев вы значительно более продуктивны при запросе в LINQ, чем в SQL. Я написал статью о том, почему это так.

Когда я устанавливал вызов LINQPad, я не шутил: я почти весь свой запрос ad-hoc в LINQ, потому что большинство запросов можно писать быстрее и надежнее в LINQ, чем в SQL. Я также разработал и работал над крупными бизнес-приложениями с использованием LINQ to SQL и видел значительный выигрыш в производительности. Это не "объект архитектуры астронавта" - LINQ to SQL - это эффективная и практичная технология, в которой управляет этим сайтом.

Самым большим препятствием для LINQ является неспособность правильно изучить его. Я видел так много запросов LINQ, которые являются ужасными транслитерациями SQL-запросов, чтобы поддержать это. Если вы пишете запросы LINQ, используя только ваши знания SQL, конечный результат может быть только одним и тем же - или хуже - чем SQL.

Ответ 23

Я только что открыл этот вопрос. Я догадываюсь, что это в значительной степени разыгралось к настоящему времени, но я собираюсь бросить свои два цента в любом случае...

Я хочу писать код только для вещей, которые не очевидны.

Код CRUD очевиден. Я не хочу это писать. Поэтому ORM - хорошая идея.

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

LINQ также является хорошей идеей. Другие упоминали ряд преимуществ, но все, что мне нужно сделать, это подумать о том, как я впервые попытался сделать точку опоры в LINQ, где я не знал количества столбцов заранее. Или в первый раз я понял, что мне не нужно было создавать новый DataView каждый раз, когда я хотел бы сортировать или фильтровать что-то. LINQ позволяет мне делать все, что я хочу делать с данными на С#, вместо того, чтобы определять, как разделить работу между SQL и С#.

Итак, да, ORM, LINQ и другие возникающие технологии - это субоптимальные решения, но они не упускают эту точку, и они не будут субоптимальными навсегда.

Ответ 24

Я хотел написать это как ответ на @SquareCog ответить здесь, но он сказал мне, что у меня осталось -1836 символов. ТАК. noob вот так извиняюсь, если я сделал это неправильно.


В 18 веке джентльмен досуга использовал для изучения науки. В то время наука в целом не была такой большой темой, которую разумно разумный человек не мог все понять. Под этим я подразумеваю, что один ученый может понять всю научную мысль того времени.

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

Так что это с программированием.

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

Я думаю, что некоторые из респондентов здесь замалчивают некоторые из сложностей разработки крупной базы данных корпоративного уровня предприятия, зная, что "горстка SQL-операторов", безусловно, не сокращает ее. Именно поэтому в большинстве крупных программных домов есть специальные команды разработчиков баз данных. Как говорит Страуступ, "Разделить и завоевать" - это единственный способ эффективно справиться со сложностью, присущей разработке и управлению крупными проектами программного обеспечения.

Разработчики не любят работать с SQL, потому что они ленивы или потому, что они заставляют их чувствовать себя "icky". Им не нравится работать с SQL, потому что они умны. Они знают лучше, чем кто-либо, что только тот, кто специализируется на SQL, обеспечит функциональность базы данных высочайшего качества, и для того, чтобы они были поставлены в положение "джека всех профессий", разработчики являются неоптимальной стратегией развития.