Одним из невероятных преимуществ LINQ to SQL над хранимыми процедурами является то, что вы можете динамически создавать запрос.
Многие сложные запросы, встроенные в хранимые процедуры, сложны в первую очередь потому, что они созданы для обработки многих возможных случаев. Например, хранимая процедура, которая реализует фильтр со многими возможными параметрами, некоторые из которых являются необязательными, должна быть построена для учета различных перестановок и может быть довольно уродливой. Конечно, вы можете создать тот же запрос в LINQ to SQL, что и один большой запрос, но прелесть LINQ to SQL в том, что вам не нужно.
Используя логику управления потоком и цепочку запросов, вы можете создать более простой запрос, который использует только те параметры, которые активны в поиске, исключая проверки или альтернативную логику, необходимые для устранения случаев, когда необязательные параметры не предоставляются. Используя Dynamic LINQ и / или PredicateBuilders , эти запросы также могут быть произвольно сложными, но все же проще, чем те, которые реализуются хранимой процедурой.
Чтобы выполнить то же самое с помощью хранимых процедур, вам нужно написать и поддерживать много разных хранимых процедур, каждая из которых выполняет одинаковую, но не одинаковую работу. Тогда вам нужно будет использовать одну и ту же логику потока для выбора между этими процедурами. Это быстро становится несостоятельным по мере увеличения количества параметров.
Другое преимущество LINQ, IMO, заключается в том, что он позволяет разработчику писать запросы, используя более естественные идиомы (в моем случае, C #). Хотя я могу писать на SQL, для меня более естественно писать код на C #. Я лучше и быстрее в этом.