Я просмотрел сообщение «Руководство для начинающих по LINQ» здесь, в StackOverflow (Руководство для начинающих по LINQ), но у меня возник вопрос:
Мы собираемся развернуть новый проект, в котором почти все наши операции с базой данных будут довольно простыми извлечениями данных (есть еще один сегмент проекта, который уже записывает данные). Большинство других наших проектов до этого момента используют хранимые процедуры для таких вещей. Однако я хотел бы использовать LINQ-to-SQL, если это имеет смысл.
Итак, вопрос таков: какой подход лучше для простого извлечения данных, LINQ-to-SQL или хранимые процедуры? Есть какие-то конкретные плюсы или минусы?
Спасибо.





Linq в Sql.
Sql-сервер будет кэшировать планы запросов, поэтому для sprocs не будет прироста производительности.
С другой стороны, ваши операторы linq будут логически частью вашего приложения и протестированы с ним. Sprocs всегда немного разделены, и их сложнее поддерживать и тестировать.
Если бы я прямо сейчас работал над новым приложением с нуля, я бы просто использовал Linq, без sprocs.
Если вы являетесь и будете наиболее опытным разработчиком запросов к базе данных, используйте то, с чем вы наиболее хорошо знакомы. В отличие от процедурного кода, вы не можете сказать: «Если он дает правильный ответ, отправьте его».
Я думаю, что LINQ to SQL может вызвать перекомпиляцию при изменении размера строкового параметра.
@RussellH: Это было верно для .Net 3.5, они исправили это в .Net 4 (как для L2S, так и для L2E)
@Kieth Не тот случай! Из Linq создается гораздо больше планов выполнения, чем из SP. Преимущества существуют с кодом для отладки; но проблемы с перекомпиляцией для корпоративного цикла развертывания; отсутствие гибкости для тестирования различных запросов ACTION, WHERE, ORDER BY. Изменение порядка оператора WHERE может привести к обработке другого запроса; предварительная выборка; это нелегко сделать в Linq. Необходимо, чтобы уровень данных был доступен для настройки. SP сложнее поддерживать и тестировать? Если вы к этому не привыкли; но SP выгодны для корпусов и VLDB, высокой доступности и т. д.! Linq - для небольших проектов, сольной работы; Действуй.
@SnapJag - Вы правы, что sprocs дают вам более точный контроль зернистости, но факт в том, что в 99% случаев (даже в больших корпоративных системах, в которых я работаю) вам не нужна дополнительная оптимизация. Sprocs сложнее поддерживать и проверять, привыкли вы к ним или нет - я очень к ним привык (я был администратором баз данных, прежде чем стать разработчиком) и следить за тем, чтобы sproc для каждой операции CRUD для множества разных таблиц был на сегодняшний день это боль. Лучшая практика (IMHO) - это кодировать наиболее простым способом, а затем запускать проверки производительности и оптимизировать только там, где это необходимо.
Я предполагаю, что вы имеете в виду Linq To Sql
Для любой команды CRUD легко профилировать производительность хранимой процедуры по сравнению с любой технологией. В этом случае разница между ними будет незначительной. Попробуйте профилировать для объекта поля 5 (простых типов) более 100 000 запросов на выборку, чтобы выяснить, есть ли реальная разница.
С другой стороны, реальным нарушителем сделки будет вопрос о том, удобно ли вам размещать бизнес-логику в своей базе данных или нет, что является аргументом против хранимых процедур.
Поскольку на данные может влиять больше мест, чем приложение, - импорт данных, другие приложения, прямые запросы и т. д., Глупо не помещать бизнес-логику в базу данных. Но если вас не волнует целостность данных, продолжайте.
Бизнес-логика не должна входить в базу данных. Он должен быть на языке программирования, где его легко отлаживать и управлять. Затем его можно использовать в приложениях как объекты. Некоторые правила могут быть в базе данных, но не бизнес-логика.
Лучший код - это отсутствие кода, и с хранимыми процедурами вам нужно написать хотя бы некоторый код в базе данных и код в приложении для его вызова, тогда как с LINQ to SQL или LINQ to Entities вам не нужно писать никаких дополнительных код, превосходящий любой другой запрос LINQ, кроме создания экземпляра объекта контекста.
немного опоздал на вечеринку, но мне понравился этот ответ;)
Я вообще сторонник размещения всего в хранимых процедурах по всем причинам, о которых администраторы баз данных твердят в течение многих лет. В случае Linq, правда, не будет разницы в производительности с простыми запросами CRUD.
Но помните о нескольких вещах, принимая это решение: использование любого ORM тесно связывает вас с вашей моделью данных. Администратор баз данных не имеет права вносить изменения в модель данных, не заставляя вас изменять скомпилированный код. С помощью хранимых процедур вы можете до некоторой степени скрыть такого рода изменения, поскольку список параметров и наборы результатов, возвращаемые процедурой, представляют ее контракт, а внутренности могут быть изменены до тех пор, пока этот контракт все еще выполняется. .
Кроме того, если Linq используется для более сложных запросов, настройка базы данных становится гораздо более сложной задачей. Когда хранимая процедура работает медленно, администратор базы данных может полностью сосредоточиться на коде изолированно и имеет множество вариантов, чтобы контракт по-прежнему удовлетворялся, когда он / она закончил.
Я видел очень много случаев, когда серьезные проблемы в приложении решались путем изменения схемы и кода в хранимых процедурах без каких-либо изменений в развернутом, скомпилированном коде.
Может быть, с Linq подойдет гибридный подход? Конечно, Linq можно использовать для вызова хранимых процедур.
Одна функция, которую вы упустили, - это безопасность. Используя Linq, вы должны предоставлять таблицы непосредственно приложению. С помощью хранимых процедур вы можете ограничить доступ к этим процедурам и обеспечить соблюдение бизнес-требований.
Мне нравится ваша идея гибридного подхода: если это простой CRUD, который не требует объединений и блокировок, особенно если вы просто запрашиваете одно поле, то вы знаете, что схема не изменится, и вы не попадете в драки. с DBA.
«Администратор баз данных не может свободно вносить изменения в модель данных, не заставляя вас изменять свой скомпилированный код». Почему вы отстаиваете это? Ни у кого не должно быть «свободы» вносить изменения, в этом суть управления конфигурацией. В любом случае изменения должны пройти через разработку, тестирование и т.д. перед развертыванием.
@ Нил: Да, но он не может вносить изменения в среду разработки, не заставляя разработчика менять код.
Должен сказать, что я много раз видел аргументы о тесной связи с базами данных, и я не уверен, что это действительно так. Я никогда не сталкивался с ситуацией (помимо тривиальных примеров), когда я хочу изменить базу данных, которая в любом случае не требует изменения кода выше. И действительно, чем в любом случае Linq отличается от хранимых процедур или параметризованных запросов. Уровень доступа к данным должен быть четко отделен и абстрагирован независимо от того, используете ли вы ORM или что-то попроще. Это то, что дает вам слабую связь, а не то, какую технологию вы используете. Просто мой 2с
@Chris: проблема безопасности, о которой вы говорите, легко решается с помощью представлений и ролей.
@Eric - Отличные комментарии. Я разработчик и администратор базы данных. Я ношу обе шляпы в консультационных целях и выступаю за то же. LINQ имеет свое место, он не заменяет SP. Что действительно улучшает, так это способность небольших проектов / команд выводить продукт на рынок. Но низкими будут те дни, когда компания / проект станет большой и ей придется адаптироваться к высокой доступности, VLDB, настройке, подсказкам, сложным запросам и т. д. Я никогда не смогу использовать Linq в своих крупномасштабных решениях с высокой доступностью. . Особенно, когда есть команды программистов и администраторов баз данных, которые сотрудничают, чтобы предоставить большие надежные решения.
В конце концов, linq - это просто причудливый способ поместить встроенный sql в ваше приложение и извлечь sql из вашей базы данных. Независимо от того, используете ли вы linq или sql или что-то еще, о чем они мечтают в будущем, причины для помещения sql в вашу базу данных по-прежнему действительны и не исчезают волшебным образом.
Я видел 199 хранимых процедур, написанных без необходимости для каждого 1 изменения схемы, которое было защищено от приложений с помощью подписи SP, но, как и сказал Саймон П. Стивенс, семантические изменения в использовании SP требовали изменений приложения на 100% в любом случае время. Не говоря уже о том факте, что само существование SP просто умоляет некоторых будущих разработчиков или dba утилизировать некоторую бизнес-логику в SP. Потом еще немного и еще немного.
@Eric LINQ to ADO.NET Entities не привязывает вас к модели данных. С помощью структуры сущностей вы определяете концептуальную модель данных, которая сопоставляется с моделью хранения, которую вы можете изменить в любое время, даже без компиляции (при условии, что сопоставление находится в текстовом файле, а не является частью двоичного файла).
Никогда не помещайте бизнес-логику в базу данных. База данных предназначена для операций формирования данных, а не для бизнес-логики. Так много причин, по которым мы больше не разделяем такие устаревшие идеи. Разложите свою систему должным образом и используйте базу данных для того, для чего она предназначена.
База данных @MicrosoftDeveloper хранит бизнес-данные и использует SQL для их обработки. Обработка данных - это не работа модных веб-приложений. Использование ORM для обработки огромного количества данных звучит уже давно устаревшими 90-ми. Для работы с базой данных нам необходимо использовать SQL и Sproc, и, как бы сильно это ни ненавидели некоторые люди, им нужно с этим жить.
Для получения базовых данных я бы без колебаний выбрал Linq.
С момента перехода на Linq я обнаружил следующие преимущества:
для меня безопасность времени компиляции является ключевым моментом!
Однако для развертывания, если вы работаете в корпоративной команде, у которой есть цикл развертывания и существует ошибка, которую необходимо быстро устранить, развертывание библиотек DLL через QA и т. д., Вероятно, будет более строгим, чем путь к развертыванию одной базы данных. сценарий. Ваши преимущества, кажется, лучше отражают сценарий небольшой команды / проекта.
Развертывание сценариев SQL, для которых не требуется проходить контроль качества, здесь не всегда хорошо.
A DBA has no freedom to make changes to the data model without forcing you to change your compiled code. With stored procedures, you can hide these sorts of changes to an extent, since the parameter list and results set(s) returned from a procedure represent its contract, and the innards can be changed around, just so long as that contract is still met.
Я действительно не вижу в этом выгоды. Возможность изменить что-то изолированно может звучать хорошо в теории, но то, что изменения соответствуют условиям контракта, не означает, что они возвращают правильные результаты. Чтобы иметь возможность определить, каковы правильные результаты, вам нужен контекст, и вы получаете этот контекст из вызывающего кода.
Некоторые преимущества LINQ перед sprocs:
Некоторые недостатки LINQ vs sprocs:
О безопасности и управляемости тоже спорят.
Раньше я был большим парнем в области sproc, но я начинаю склоняться к LINQ как к лучшей альтернативе в целом. Если есть области, где sproc явно лучше, я, вероятно, все равно напишу sproc, но получу к нему доступ с помощью LINQ. :)
«LINQ работает с большим количеством баз данных» Но LINQTOSQL поддерживает только SQL Server.
LINQ to Entities работает с Postgres и MySql в дополнение к MSSQL. Не уверен, но мне показалось, что я читал, что есть что-то для Oracle.
В devart dotConnect есть функция Oracle, но она чертовски глючит. Кроме того, я не могу преодолеть дефицит производительности, который возникает из-за необходимости выбирать данные из базы данных для их обновления (Attach () также возможен, но это довольно неприятно)
Я не видел, чтобы здесь кто-нибудь упоминал о повторном использовании кода. Вы не можете повторно использовать linq в приложении VB6, asp или file maker pro. Если вы поместите что-то в базу данных, это можно будет повторно использовать ВЕЗДЕ. Я думаю, вы могли бы создать dll с linq, но это становится слишком сложным и дерьмовым, imo. Гораздо проще добавить функцию или сохраненную процедуру, которую можно использовать повторно.
Говоря о повторном использовании кода в TSQL (1) удачи, пытаясь сохранить результаты хранимой процедуры во временную таблицу, не прибегая к динамическому sql. (2) Вы мало что можете сделать, чтобы организовать все свои процессы / функции; пространство имен быстро становится загроможденным. (3) Вы написали мощный оператор выбора, но теперь вы хотите, чтобы пользователь мог выбирать столбец, который будет отсортирован - в TSQL вам, возможно, придется использовать CTE, который задает row_number для каждого столбца, который может быть отсортирован; в LINQ ее можно решить с помощью нескольких операторов if, задумываясь позже.
Немного поздно для вечеринки, но я думаю, что управление версиями также является довольно большим преимуществом LINQ. Наличие хранимых процедур, для которых версии не используются вообще, или для которых используется отдельная версия от источника приложения, - потенциальная причина катастрофы.
LINQ не запрещает использование хранимых процедур. Я использовал смешанный режим с LINQ-SQL и LINQ-storedproc. Лично я рад, что мне не нужно писать хранимые процедуры .... pwet-tu.
LINQ раздувает кеш процедур
Если приложение использует LINQ to SQL, а запросы включают использование строк, длина которых может сильно варьироваться, кэш процедур SQL Server станет раздутым с одной версией запроса для каждой возможной длины строки. Например, рассмотрим следующие очень простые запросы, созданные для таблицы Person.AddressTypes в базе данных AdventureWorks2008:
var p =
from n in x.AddressTypes
where n.Name == "Billing"
select n;
var p =
from n in x.AddressTypes
where n.Name == "Main Office"
select n;
Если оба этих запроса будут выполнены, мы увидим две записи в кэше процедур SQL Server: одна связана с NVARCHAR (7), а другая - с NVARCHAR (11). А теперь представьте, что существуют сотни или тысячи различных входных строк разной длины. Кэш процедур стал бы излишне заполненным всевозможными планами для одного и того же запроса.
Подробнее здесь: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290
Какой глупый аргумент - просто используйте переменную, и ваша проблема будет решена.
@John, это не поможет, если вы использовали валидацию вместо буквальной строки, поскольку в конце вы отправляете буквальную строку в базу данных. он может выглядеть как переменная в вашем коде, но это будет строка в сгенерированном T-SQL, которая будет отправлена в БД.
SQLMenace: согласно странице, на которую вы ссылаетесь, проблема решена в VS2010.
Эта проблема была действительной на момент публикации ответа, но с тех пор она была решена в VS2010, так что это больше не проблема.
Я думаю, что аргумент в пользу LINQ, кажется, исходит от людей, у которых нет опыта разработки баз данных (в целом).
Многие из приведенных здесь аргументов неприменимы, особенно при использовании такого продукта, как VS DB Pro или Team Suite, например:
Сложнее поддерживать и тестировать: VS обеспечивает полную проверку синтаксиса, проверку стиля, проверку ссылок и ограничений и многое другое. Он также предоставляет полные возможности модульного тестирования и инструменты рефакторинга.
LINQ делает невозможным истинное модульное тестирование, поскольку (на мой взгляд) не проходит тест ACID.
LINQ упрощает отладку: Почему? VS позволяет выполнять полный переход от управляемого кода и регулярную отладку SP.
Скомпилирован в одну DLL, а не в сценарии развертывания: И снова VS приходит на помощь, где он может создавать и развертывать полные базы данных или вносить безопасные для данных инкрементальные изменения.
Не нужно изучать TSQL с LINQ: Нет, не знаете, но вам нужно изучить LINQ - в чем польза?
I really don't see this as being a benefit. Being able to change something in isolation might sound good in theory, but just because the changes fulfil a contract doesn't mean it's returning the correct results. To be able to determine what the correct results are you need context and you get that context from the calling code.
Слабосвязанные приложения - конечная цель всех хороших программистов, поскольку они действительно повышают гибкость. Возможность изменять что-либо изолированно - это фантастика, и именно ваши модульные тесты гарантируют, что он по-прежнему возвращает соответствующие результаты.
Прежде чем вы все расстроитесь, я думаю, что у LINQ есть свое место и великое будущее. Но я не думаю, что для сложных приложений с интенсивным использованием данных он готов заменить хранимые процедуры. Этого мнения я придерживался одним из лучших игроков TechEd в этом году (они останутся безымянными).
Обновлено: Сторона хранимой процедуры LINQ to SQL - это то, о чем мне все еще нужно прочитать больше - в зависимости от того, что я нахожу, я могу изменить свою вышеупомянутую диатрибу;)
Изучение LINQ не составляет большого труда - это просто синтаксический сахар. TSQL - это совершенно другой язык. Яблоки и апельсины.
Преимущество изучения LINQ заключается в том, что он не привязан к одной технологии - семантика запросов может использоваться для XML, объектов и т. д., И со временем она будет расширяться.
Согласовано! Так много людей (разработчиков) ищут решение, позволяющее ускорить вывод на рынок в небольших командах и проектах. Но если разработка выйдет на новый уровень корпоративного стиля с несколькими командами, большими базами данных, распределенными системами большого объема и высокой доступностью, использование LINQ будет совсем другим! Я не верю, что вам понадобится слишком долго редактировать свое мнение. LINQ не предназначен для более крупных проектов / команд, в которых задействовано несколько человек, несколько команд (разработчики и администраторы баз данных), И они имеют строгий график развертывания.
LINQ определенно имеет свое место в базах данных для конкретных приложений и на малых предприятиях.
Но на большом предприятии, где центральные базы данных служат центром общих данных для многих приложений, нам нужна абстракция. Нам нужно централизованно управлять безопасностью и отображать истории доступа. Нам нужно уметь проводить анализ воздействия: если я внесу небольшое изменение в модель данных для удовлетворения новых бизнес-потребностей, какие запросы нужно будет изменить и какие приложения нужно будет повторно протестировать? Это мне дают представления и хранимые процедуры. Если LINQ может сделать все это и сделать наших программистов более продуктивными, я буду приветствовать это - есть ли у кого-нибудь опыт использования его в такой среде?
Вы поднимаете хороший вопрос; LINQ в этом случае не является альтернативой.
Все ваши приложения должны использовать уровень доступа к данным общий (конечно, это не всегда так). Если да, то вы можете внести одно изменение в общую библиотеку и выполнить повторное развертывание. Вы также можете использовать что-то вроде WCF для обработки доступа к данным за вас. Есть хороший уровень абстракции, который технически может использовать linq для доступа к данным за кулисами. Я думаю, все зависит от того, что ваши ребята придумали для ваших требований в отношении использования SP против Linq.
Также существует проблема возможного отката 2.0. Поверьте, это случалось со мной пару раз, поэтому я уверен, что это случилось с другими.
Я также согласен с тем, что абстракция лучше всего. Наряду с этим, первоначальная цель ORM состоит в том, чтобы обеспечить соответствие РСУБД концепциям объектно-ориентированного программирования. Однако, если до LINQ все работало нормально из-за того, что приходилось немного отклоняться от концепций объектно-ориентированного проектирования, тогда к черту. Концепции и реальность не всегда хорошо сочетаются друг с другом. В IT нет места воинствующим фанатикам.
LINQ является новым и имеет свое место. LINQ изобретен не для замены хранимой процедуры.
Здесь я сосредоточусь на некоторых мифах о производительности и недостатках, только для «LINQ to SQL», конечно, я могу ошибаться ;-)
(1) Люди говорят, что статус LINQ может «кэшироваться» на сервере SQL, поэтому он не теряет производительности. Частично верно. «LINQ to SQL» фактически является средой выполнения, переводящей синтаксис LINQ в состояние TSQL. Таким образом, с точки зрения производительности жестко запрограммированный оператор SQL ADO.NET ничем не отличается от LINQ.
(2) Рассмотрим пример, пользовательский интерфейс обслуживания клиентов имеет функцию «передачи учетной записи». сама эта функция может обновлять 10 таблиц БД и возвращать несколько сообщений за один раз. Используя LINQ, вы должны создать набор операторов и отправить их одним пакетом на SQL-сервер. производительность этого переведенного пакета LINQ-> TSQL вряд ли может соответствовать хранимой процедуре. Причина? поскольку вы можете настроить наименьшую единицу оператора в хранимой процедуре с помощью встроенного профилировщика SQL и инструмента плана выполнения, вы не можете сделать это в LINQ.
Дело в том, что когда речь идет об одной таблице БД и небольшом наборе данных CRUD, LINQ работает так же быстро, как SP. Но для гораздо более сложной логики хранимая процедура более настраиваема для производительности.
(3) «LINQ to SQL» легко заставляет новичков вводить ограничения производительности. Любой старший специалист по TSQL может сказать вам, когда не следует использовать CURSOR (в большинстве случаев вам не следует использовать CURSOR в TSQL). С LINQ и очаровательным циклом foreach с запросом новичку так легко написать такой код:
foreach(Customer c in query)
{
c.Country = "Wonder Land";
}
ctx.SubmitChanges();
Вы можете видеть, что этот простой приличный код настолько привлекателен. Но под капотом среда выполнения .NET просто переводит это в пакет обновлений. Если есть только 500 строк, это пакет TSQL на 500 строк; Если есть миллион строк, это хит. Конечно, опытный пользователь не воспользуется этим способом для выполнения этой работы, но дело в том, что так легко упасть.
легко потерпеть неудачу с указателями в C / C++ / C#, значит ли это, что их никогда не следует использовать?
Сколько программистов среднего уровня имеют дело с указателями? Linq предоставляет эту возможность любому кодировщику уровней, что значительно увеличивает риск ошибки.
Вы сравниваете новичков в LINQ со старшим парнем из TSQL. Не совсем справедливое сравнение. Я согласен с вашим кодом, LINQ не работает для пакетного обновления / удаления в целом. Однако я бы сказал, что большинство аргументов в отношении производительности между LINQ и SP являются утверждениями, но не основаны на измерении.
ИМХО, RAD = LINQ, RUP = Stored Procs. Я много лет работал в крупной компании из списка Fortune 500, на многих уровнях, включая руководство, и, честно говоря, я бы никогда не нанял разработчиков RUP для разработки RAD. Они настолько разобщены, что у них очень ограниченные знания о том, что делать на других уровнях процесса. В изолированной среде имеет смысл предоставить администраторам баз данных контроль над данными через очень конкретные точки входа, потому что другие, откровенно говоря, не знают наилучших способов управления данными.
Но крупные предприятия медленно продвигают болезненно в области разработки, а это чрезвычайно дорого. Бывают случаи, когда вам нужно действовать быстрее, чтобы сэкономить время и деньги, и LINQ предоставляет это и многое другое в избытке.
Иногда мне кажется, что администраторы баз данных предвзято относятся к LINQ, потому что считают, что это угрожает их безопасности работы. Но такова природа зверя, дамы и господа.
Да, мы, администраторы баз данных, сидим и ждем весь день, пока вы не запросите запуск хранимой процедуры в производственную среду. Если этого не сделать, мы разобьемся от сердца!
Я не администратор баз данных, но ваше представление о вакансиях администраторов баз данных очень необоснованно. Вероятно, в небольшом стартапе, создающем модное мобильное приложение, они не требуются (где вы в основном найдете разработчиков, ненавидящих SQL), но для безопасности данных крупного предприятия доступность абсолютно важна. Я видел множество инцидентов, когда разработчикам БД и администраторам баз данных приходилось оптимизировать дрянной код, написанный так называемыми разработчиками RAD, которые не понимают, как работает база данных.
По словам гуру, я определяю LINQ как мотоцикл, а SP как автомобиль. Если вы хотите совершить короткую поездку и у вас есть только маленькие пассажиры (в данном случае 2), используйте LINQ изящно. Но если вы хотите отправиться в путешествие и иметь большую группу, я думаю, вам следует выбрать SP.
В заключение, выбор между мотоциклом или автомобилем зависит от вашего маршрута (бизнес), длины (время) и пассажиров (данные).
Надеюсь, это поможет, но могу ошибаться. : D
друзья погибли на мотоциклах: P
люди погибли и за рулем автомобиля.
да ты не прав.
И LINQ, и SQL имеют свои места. У обоих есть свои недостатки и преимущества.
Иногда для получения сложных данных могут потребоваться сохраненные процедуры. И иногда вы можете захотеть, чтобы другие люди использовали вашу сохраненную процедуру в Sql Server Management Studio.
Linq to Entities отлично подходит для быстрой разработки CRUD.
Конечно, вы можете создать приложение, используя только одно или другое. Или можете перепутать. Все сводится к вашим требованиям. Но хранимые процессы SQL никуда не денутся в ближайшее время.
Результат можно резюмировать как
LinqToSql для небольших сайтов и прототипов. Это действительно экономит время на прототипирование.
СПС: Универсальный. Я могу точно настроить свои запросы и всегда проверять ActualExecutionPlan / EstimatedExecutionPlan.
Create PROCEDURE userInfoProcedure
-- Add the parameters for the stored procedure here
@FirstName varchar,
@LastName varchar
AS
BEGIN
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT FirstName , LastName,Age from UserInfo where FirstName=@FirstName
and LastName=@FirstName
END
GO
http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx
Какой в этом смысл?
Я думаю нужно идти с проков ни на что реальное.
A) Написание всей вашей логики в linq означает, что ваша база данных менее полезна, потому что только ваше приложение может ее использовать.
Б) Я не уверен, что объектное моделирование лучше, чем реляционное моделирование.
C) Тестирование и разработка хранимой процедуры в SQL происходит намного быстрее, чем цикл редактирования компиляции в любой среде Visual Studio. Вы просто редактируете, F5 и нажимаете select, и вы отправляетесь в гонки.
D) Хранимые процедуры проще управлять и развертывать, чем сборки .. вы просто кладете файл на сервер и нажимаете F5 ...
E) Linq to sql по-прежнему пишет дрянной код, когда вы этого не ожидаете.
Честно говоря, я думаю, что в конечном итоге MS могла бы дополнить t-sql, чтобы он мог выполнять проекцию соединения неявно, как это делает linq. t-sql должен знать, хотите ли вы, например, сделать order.lineitems.part.
Хранимая процедура упрощает тестирование, и вы можете изменить запрос, не касаясь кода приложения. Также с linq получение данных не означает, что это правильные данные. А проверка правильности данных означает запуск приложения, но с хранимой процедурой легко проверить, не касаясь приложения.
Для простых операций CRUD с единственной точкой доступа к данным я бы посоветовал перейти на LINQ, если вы чувствуете себя комфортно с синтаксисом. Я думаю, что для более сложной логики sprocs более эффективны с точки зрения производительности, если вы хорошо разбираетесь в T-SQL и его более сложных операциях. У вас также есть помощь от Tuning Advisor, SQL Server Profiler, отладки ваших запросов из SSMS и т. д.
Все эти ответы, склоняющиеся к LINQ, в основном говорят о ПРОСТОТА РАЗРАБОТКИ, которая более или менее связана с низким качеством кодирования или ленью в кодировании. Я только такой.
Я читаю здесь некоторые преимущества Linq: их легко протестировать, легко отладить и т. д., Но они не связаны с Final output или конечным пользователем. Это всегда вызывает проблемы с производительностью конечного пользователя. Какой смысл загружать много вещей в память, а затем применять фильтры при использовании LINQ?
Опять же TypeSafety - это предупреждение о том, что «мы осторожны, чтобы избежать неправильного приведения типов», что опять же плохого качества, которое мы пытаемся улучшить с помощью linq. Даже в этом случае, если что-то изменится в базе данных, например размер столбца String, то linq необходимо перекомпилировать, и без этого он не будет безопасным по типу .. Я пробовал.
Хотя мы обнаружили, что при работе с LINQ это хорошо, мило, интересно и т. д., У него есть серьезный недостаток, заключающийся в том, что разработчик становится ленивым :) и 1000 раз доказано, что это плохо (может быть хуже) с точки зрения производительности по сравнению с хранимыми процедурами.
Перестань лениться. Я очень стараюсь. :)
Загружать все в память и фильтровать? Linq может отправлять фильтр как часть запроса в базу данных и возвращает отфильтрованный набор результатов.
Есть немало людей, которые считают, что LINQ загружает все данные и обрабатывает их с помощью цикла foreach. Это неверно. Он просто компилируется в запрос sql и обеспечивает почти такую же производительность для большинства операций CRUD. Но да, это не серебряная пуля. Бывают случаи, когда использование T-SQL или хранимых процедур может оказаться лучше.
Я согласен с обоими контраргументами. Однако не совсем верно, что linq отправляет в СУБД все фильтры для работы с ней. Есть несколько вещей, которые работают в памяти, одна из них отличается.
Я не согласен с вашими комментариями об отсутствии выгоды для sprocs. Я описал серию подходов к доступу к SQL Server в системе prod, и использование Prepare + stored procs дало одни из лучших результатов. Даже при нескольких вызовах одной и той же логики. Возможно, вы правы в отношении БД с низким уровнем использования.