Estamos de volta no projeto Freelando. Acabamos de criar um endpoint que executa uma stored procedure (SP) no banco de dados do SQL Server. No entanto, devemos executar outra stored procedure agora.
Vamos abrir novamente o banco de dados no Microsoft SQL Server Management Studio para entender melhor a estrutura dessa stored procedure chamada sp_PropostaPorProjeto.
Ao clicar com o botão direito em cima dela e selecionar a opção "Modificar", podemos conferir o conteúdo dessa stored procedure.
USE [Freelando]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_PropostaPorProjeto]
@Id_Projeto uniqueidentifier
AS
BEGIN
SELECT Id_Proposta, Id_Projeto, Id_Profissional, Valor_Proposta, Data_Proposta, Mensagem, Prazo_Entrega
FROM dbo.TB_Propostas WHERE Id_Projeto = @Id_Projeto
END
Ela realiza um SELECT na tabela de TB_propostas, mas esse comando tem um parâmetro, um filtro que será o Id_Projeto. Como não queremos modificar nada, podemos apenas fechar a janela.
Executando stored procedures com parâmetros
No arquivo PropostasExtensions.cs no Visual Studio, vamos criar um novo endpoint para executar essa stored procedure. Já preparamos a estrutura desse endpoint e vamos colá-lo em AddEndPointPropostas().
PropostasExtensions.cs:
public static void AddEndPointPropostas(this WebApplication app)
{
app.MapGet("/propostas/projeto", async ([FromServices] IUnitOfWork unitOfOrk, [FromQuery] Guid id_projeto) =>
{
}).WithTags("Propostas").WithOpenApi();
}
Também é um GET para a rota /propostas/projeto e receberá como parâmetro o Guid id_projeto.
Novamente, vamos criar novamente uma var propostas que recebe await, já que estamos trabalhando com programação assíncrona. Em seguida, escrevemos unitOfOrk.contexto.Propostas.FromSqlRaw().
No FromSqlRaw(), devemos passar tanto a stored procedure quanto o parâmetro. Entre aspas, vamos colar o comando que vamos executar. Nesse caso, será EXEC e o nome da stored procedure, dbo.sp_PropostaPorProjeto, como fizemos no endpoint anterior. Porém, também passamos o parâmetro, @id_projeto={0}.
Para informar o ID do projeto, vamos adicionar uma vírgula, ainda dentro do FromSqlRaw, mas fora das aspas, para colocar id_projeto. Fora dos parênteses, acrescentamos .ToListAsync().
Essa é a maneira de executar uma stored procedure que recebe parâmetros.
Finalmente, completamos com return Results.Ok() nas propostas.
public static void AddEndPointPropostas(this WebApplication app)
{
app.MapGet("/propostas/projeto", async ([FromServices] IUnitOfWork unitOfOrk, [FromQuery] Guid id_projeto) =>
{
var propostas = await unitOfOrk.contexto.Propostas.FromSqlRaw("EXEC dbo.sp_PropostaPorProjeto @id_projeto={0}", id_projeto).ToListAsync();
return Results.Ok(propostas);
}).WithTags("Propostas").WithOpenApi();
}
Vamos salvar o arquivo e testar o novo endpoint, clicando no botão "HTTPS".
No Swagger, vamos consultar as propostas cadastradas primeiramente para pegar o ID do projeto. Selecionando GET /propostas, clicamos no botão "Try it out" e, em seguida, em "Execute".
No corpo da resposta, vamos copiar o valor da chave projetoID do primeiro projeto com o atalho "Ctrl + C":
1f9619ff-8b86-d011-b42d-00c04fc964ff
Agora, vamos acessar o endpoint que acabamos de criar, GET /propostas/projeto. Após apertar "Try it out", vamos colar o ID do projeto no campo obrigatório chamado "id_projeto". Depois, vamos clicar no botão "Execute".
Corpo da resposta do endoint https://localhost:7177/propostas/projeto?id_projeto=1f9619ff-8b86-d011-b42d-00c04fc964ff:
[
{
"id": "56dd4990-e79a-4d44-8516-02caf9644357",
"profissionalId": "409619ff-8b86-d011-b42d-00c04fc964ff",
"projetoId": "1f9619ff-8b86-d011-b42d-00c04fc964ff",
"valorProposta": 2123.11,
"dataProposta": "2023-07-11T10:15:30.047",
"mensagem": "Refatoração para clean arch",
"prazoEntrega": "2023-08-10T00:00:00"
},
{
"id": "7be72420-405c-4d31-8584-d113275096f1",
"profissionalId": "409619ff-8b86-d011-b42d-00c04fc964ff",
"projetoId": "1f9619ff-8b86-d011-b42d-00c04fc964ff",
"valorProposta": 5201.12,
"dataProposta": "2023-07-12T10:15:30.047",
"mensagem": "Projeto implementação Microserviços",
"prazoEntrega": "2023-08-11T00:00:00"
}
]
Note que as duas propostas cadastradas são para o mesmo projeto, pois tem o mesmo projetoId. Isso significa que a consulta está funcionando.
Conclusão
Nesse vídeo, criamos mais um endpoint que também executa uma stored procedure. A diferença é que essa stored procedure recebe um parâmetro.
Para isso, continuamos utilizando o FromSqlRaw(), mas informamos na string do comando que vamos utilizar o parâmetro, através da estrutura @nome-parametro e o valor que espera ser recebido, entre chaves. E, fora da string, passamos o parâmetro que será concatenado junto a esse comando.
Na sequência, vamos continuar trabalhando com as outras stored procedures do projeto.