Talvez faça sentido, inverter a questão e encontrar casos de uso onde apenas procedimentos armazenados poderiam fazer, o que você deseja obter. Talvez haja realmente casos de uso, nos quais os procedimentos armazenados se destacam.
Se isso faz diferença, estou usando o MSSQL e o Entity Framework.
Meu conhecimento sobre EF é limitado, mas, tanto quanto posso ver, EF é ( apenas ) um ORM como qualquer outro; e felizmente é capaz de usar SQL bruto .
Se eu pegar seus dois pontos principais:
Um relatório complicado que estava demorando minutos para ser executado (era uma página em um aplicativo da web). Eu descobri que podia escrever SQL que era muito mais eficiente (levando apenas alguns segundos para executar) do que o LINQ estava fornecendo.
O LINQ / EF estava aquém, ao fazer um relatório. E como você notou, foi SQL
muito mais rápido do que usar um ORM. Mas fala isso em favor de procedimentos armazenados ou apenas contra o uso do ORM para tudo?
Seu problema obviamente poderia ser resolvido com o SQL . Se essa consulta foi armazenada e a versão controlada em sua base de código faz, de acordo com o seu exemplo, pelo menos nenhuma diferença .
Um aplicativo da Web precisava ler e gravar em algumas tabelas em um banco de dados separado que continha muitas outras informações confidenciais que eram irrelevantes para o aplicativo. Em vez de dar acesso a tudo, usei um procedimento armazenado que faz apenas o necessário e retorna apenas informações limitadas. O aplicativo da Web poderia então ter acesso apenas a este procedimento armazenado, sem acesso a nenhuma tabela etc.
A mesma coisa aqui: uma cadeia de conexão simples e UPDATE e seu problema está concluído. Esse problema pode ser resolvido mesmo com um ORM :
basta usar um serviço da Web na frente do outro banco de dados e a mesma compartimentação / isolamento é alcançada.
Então, nada para ver aqui.
Olhando para alguns pontos que outros fizeram:
Você tem unidades de trabalho complexas, talvez envolvendo muitas tabelas, que não podem ser agrupadas em uma transação facilmente usando os recursos do EF.
Mas SQL
pode fazer isso. Nenhuma mágica envolvida aqui.
Seu banco de dados não funciona bem com EF
Novamente: Use EF quando apropriado.
Você precisa trabalhar com dados que cruzam os limites do servidor com servidores vinculados
Não vejo como os procedimentos armazenados ajudam. Portanto, não consigo ver uma vantagem dos procedimentos armazenados; mas talvez alguém lance alguma luz sobre isso.
Você tem cenários de recuperação de dados muito complexos nos quais é necessário SQL "bare metal" para garantir desempenho adequado
Mais uma vez: "Limites da EF ".
Seu aplicativo não possui permissões CRUD completas em uma tabela, mas pode ser permitido que ele seja executado em um contexto de segurança em que seu servidor confia
OK. Eu vou com um talvez .
Até agora, apenas meio ponto foi feito em favor dos procedimentos armazenados.
Talvez haja considerações de desempenho, que falam a favor de procedimentos armazenados.
1) O armazenamento de consultas tem o benefício de uma simples chamada para o procedimento armazenado, que encapsula a complexidade. Como o planejador de consultas conhece a consulta, é "mais fácil" otimizar. Mas os salvamentos estão com o planejador de consultas sofisticado atual _minimal.
Além disso, mesmo que haja um pequeno custo usando consultas ad hoc , se seus dados estiverem bem estruturados e cuidadosamente indexados, o banco de dados será apenas o gargalo do seu aplicativo. Portanto, mesmo se houver um pequeno delta, é negligenciável considerando outros fatores.
2) No entanto, foi discutido o armazenamento de consultas complexas em um banco de dados. Há duas coisas a considerar:
a) consultas complexas fazem uso massivo da infraestrutura do banco de dados, o que aumenta o tempo de resposta para todas as outras consultas. Você não pode executar muitas consultas caras em paralelo . Isso não fala procedimentos pró e contra armazenados, mas contra consultas complexas .
b) Se a consulta demorar algum tempo, por que se preocupar com pequenas vitórias de velocidade de um procedimento armazenado?
tl; dr
Nada fala diretamente contra procedimentos armazenados. Portanto, é bom usar procedimentos armazenados - se isso o faz feliz.
Mas, por outro lado: não conseguia imaginar um caso de uso adequado que fale inequivocamente a favor.
Quando devo usar os procedimentos armazenados?
A resposta correta é: sempre que quiser . Mas há outras opções.