Ваша основная предпосылка ошибочна ..
Встроенный SQL требует определенного взаимодействия с базой данных, что открывает базу данных для инъекций.
Нет, это не так. Жесткое кодирование введенных пользователем значений в оператор SQL позволяет, но это можно сделать и с помощью процедур хранения.
Параметризация ваших запросов защищает от атак внедрения, но встроенный SQL может параметрироваться так же легко, как и хранимые процедуры.
Встроенный SQL также должен проверяться на синтаксис, иметь план и затем выполняться.
Все Sql (SP и inline) должны быть проверены на синтаксис и иметь план, основанный на их первом вызове. После этого точный текст запроса и план выполнения кэшируются. Если получен другой запрос с точно таким же текстом (без учета параметров), используется кэшированный план выполнения.
Итак, если вы жестко закодировали значения во встроенный SQL, текст не будет совпадать, и он должен будет повторно проанализировать запрос. Однако, если вы используете параметры, текст запроса будет совпадать, и вы получите попадание в кеш. В этом случае не имеет значения, будет ли запрос встроенным SQL или SP.
Другими словами, единственная проблема с встроенным SQL состоит в том, что легко сделать что-то медленное и небезопасное. Но сделать встроенный SQL быстрым и безопасным больше не нужно, если использовать SP.
Что приводит нас к LINQ, который всегда использует параметры, даже если вы жестко закодируете значения в операторе LINQ, что делает «быстрый и безопасный» встроенный SQL тривиальным.
LINQ также имеет преимущество перед SP в том, что весь ваш код находится в одном месте, а не разбросан по двум различным машинам.