entity-framework

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.

Curso de Web Application com Razor

Image

https://ecode10.academy/curso/23/webapplication-com-razor