Разве Linq to SQL не упускает смысл? Разве ORM-картографы (SubSonic и т. Д.) Не являются оптимальными решениями? - PullRequest
69 голосов
/ 19 января 2009

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

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

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

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

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

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

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

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

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

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

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

Select EventID, Title From Events Where Location=@Location

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

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

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

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

Ответы [ 24 ]

1 голос
/ 05 мая 2009

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

Когда я установил LINQPad Challenge, я не шутил: я делаю почти все свои специальные запросы в LINQ, потому что большинство запросов могут быть написаны быстрее и надежнее в LINQ, чем в SQL. Я также проектировал и работал над крупными бизнес-приложениями, использующими LINQ to SQL, и увидел значительный рост производительности. Это не «астронавт архитектуры» - LINQ to SQL - это продуктивная и практичная технология, которая управляет этим самым сайтом .

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

1 голос
/ 19 января 2009

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

Я все еще предпочитаю испачкать руки SQL. По крайней мере, я точно знаю, что происходит.

1 голос
/ 20 января 2009

Тед Ньюард написал большое эссе о своем взгляде на эту тему - что ORM - это "Вьетнам" информатики ...

http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx

0 голосов
/ 26 мая 2011

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


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

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

Так же и с программированием.

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

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

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

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