Retornando IEnumerable na API

image

Ol√° pessoal, meu nome √© Mauricio Junior e hoje eu vou mostrar e falar como retornar IEnumerable dentro da Api para o cliente que chamar o endere√ßo. No c√≥digo 1.1 recebe como par√Ęmetro apenas o id do usu√°rio, cria uma rela√ß√£o entre duas tabelas atrav√©s do join e depois coloca uma condi√ß√£o para ser verificado.

  • Ferramenta: Visual Studio ou Rider
  • Linguagem de programa√ß√£o C#
  • Linq para fazer select
  • Framework Entity Framework

As vezes o desenvolvedor pode retornar além de uma classe customizada, pode retornar um IEnumerable com os campos informados no select de retorno. Talvez você esteja acostumado a retornar sempre uma classe como CursoModel ou UsuarioModel, mas no meu caso eu não quero vincular nenhuma classe e para isso eu resolvi retornar um IEnumerable, veja o código 1.1.

Código 1.1 - Carregar o usuário

public IEnumerable LoadUser(int userId)
{
    try
    {
        return
        (
            from c in _db.CourseModels
            join cu in _db.CourseUserModels
                on c.CourseId equals cu.CourseId
            
	where cu.UserId == userId && 
                  cu.Status == 1 
            
	select new
            {
                Date = c.Date,
                Description = c.Description,
                Status = c.Status,
                Title = c.Title,
                CourseId = c.CourseId,
                CourseLink = c.CourseLink,
                ImageCourse = c.ImageCourse,
                UserId = c.UserId,
                CourseCategoryId = c.CourseCategoryId,
                CourseDescription = c.CourseDescription,
                CoursePrice = c.CoursePrice,
                CoursePriceCupom = c.CoursePriceCupom,
                CupomCode = c.CupomCode
            }
        ).ToList();
    }
    catch (Exception ex)
    {
        _logger.LogError($"Method: {MethodBase.GetCurrentMethod().Name} - Exception: {ex.Message} - {DateTime.Now}");
        throw;
    }
}

Para fazer o Join é necessário vincular as duas tabelas através da chave, mas isso é um outro assunto, só para você não esquecer. No final eu utilizo o select new e coloco todos os campos necessários de retorno.

Para colocar os campos, primeiro eu preciso utilizar um nome, pode ser qualquer nome, e depois o valor que será atribuído, por exemplo: Date = c.Date. A letra c vem do alias da tabela Course e consequentemente o campo Date vem de lá.

Depois de atribuir todos os valores e como pode vir mais de um dado, coloquei o .ToList() e com o IEnumberable, basta ser feliz.

Eu recomendo a todos a utilizar classes customizadas mas nesse caso, eu n√£o precisei. Apenas o cliente ser√° necess√°rio criar uma classe customizada para que o dados possa ser deserializado.

Uma outra opção para retornar apenas um resultado de uma tabela usando o select c (alias definido) como no código 1.2.

Código 1.2 - Retornando os dados de uma tabela.

public IEnumerable LoadUser(int userId)
{
    try
    {
        return
        (
            from c in _db.CourseModels
            join cu in _db.CourseUserModels
                on c.CourseId equals cu.CourseId
            
	where cu.UserId == userId && 
                  cu.Status == 1 
            
	select c

        ).ToList();
    }
    catch (Exception ex)
    {
        _logger.LogError($"Method: {MethodBase.GetCurrentMethod().Name} - Exception: {ex.Message} - {DateTime.Now}");
        throw;
    }
}

Lembro que existem v√°rios cursos que eu ensino como fazer isso de uma maneira mais detalhada na plataforma ecode10.academy.

Bom, espero que tenha gostado e eu fico por aqui. Qualquer d√ļvida voc√™ entrar em contato comigo aqui www.mauriciojunior.net ou aqui www.ecode10.com.