Executando Stored Procedure com EF
Olá pessoal, meu nome é Mauricio Junior e hoje eu vou mostrar como executar via código C# como chamar uma simples stored procedure usando Entity Framework.
Problema: Eu tenho uma storage procedure enorme e que faz várias coisas e eu preciso chamar ela pelo C# com o Visual Studio da Microsoft usando o framework da Microsoft chamado Entity Framework.
Depois de colocar o DbContext e informar a classe com Get e Set da tabela do database, da para chamar View ou Storage Procedure que retorna os dados de uma determinada tabela.
Vamos para o código
O código mostra a chamada e depois fiz um distinct.
public List<ClassItem> ExecuteTaskProcedure()
{
try
{
const string findDuplicateTaskStoredProcedure = "exec [dbo].[FindDuplicateTasks]";
var result = _db. ClassItem.FromSqlRaw<ClassItem>(findDuplicateTaskStoredProcedure).ToList();
//distinct by container
result = result.DistinctBy(x => x.Container).ToList();
return result;
}catch(Exception ex)
{
_logger.LogError("Method: {Name} - Exception: {ExMessage} - {Now}", MethodBase.GetCurrentMethod()!.Name, ex.Message, DateTime.Now);
throw;
}
}
Código 1 - ExecuteTaskProcedure
Primeiro eu criei uma constante com o comando exec [dbo][FindDuplicateTasks]
para chamar na chamada do comando. Código 2.
try
{
const string findDuplicateTaskStoredProcedure = "exec [dbo].[FindDuplicateTasks]";
...
...
}
Código 2 - Definindo constante
Para executar a procedure é necessário execute o método FromSqlRaw passando o parâmetro, código 3.
try
{
const string findDuplicateTaskStoredProcedure = "exec [dbo].[FindDuplicateTasks]";
var result = _db. ClassItem
.FromSqlRaw<ClassItem>(findDuplicateTaskStoredProcedure)
.ToList();
...
...
}
Código 3 - FromSqlRaw
Depois de definir a constante, é necessário utilizar o DbContext. Com o nome da classe é necessário chamar o método FromSqlRaw com o nome da constante que é o comando "exec". O retorno dos dados é armazenado na variável result e é feito um Distinct por um campo e depois disso, retorna o valor.
try
{
const string findDuplicateTaskStoredProcedure = "exec [dbo].[FindDuplicateTasks]";
var result = _db. ClassItem
.FromSqlRaw<ClassItem>(findDuplicateTaskStoredProcedure).ToList();
//distinct by container
result = result.DistinctBy(x => x.Container).ToList();
return result;
}
Código 4 - Distinct.
Com a variável e dados retornados do database utilizei o DistinctBy para cortar os dados repetidos e assim poder tratar da maneira que eu quiser.
Depois disso basta fazer o retorno dos dados.
Espero que tenha gostado e qualquer dúvida pode entrar em contato comigo pelo site pessoal mauriciojunior.net ou pela plataforma ecode10.academy.