Adicionando OData em uma API ASP.NET Core \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 12 Horas 

 06 Min 

 54 Seg 

   Tempo restante da oferta: 12 06 54 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Adicionando OData em uma API ASP.NET Core  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) [ .NET Core ](https://www.treinaweb.com.br/blog/categoria/net-core) 

# Adicionando OData em uma API ASP.NET Core

 OData é um padrão de boas práticas para a criação de API. Veja os recursos que este padrão fornece para uma API ASP.NET Core.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/ASP-NET-ODATA.png)  

Imagine a situação, é necessário criar uma [API](https://www.treinaweb.com.br/blog/o-que-e-uma-api) que será consumida pela versão web e versão mobile da aplicação. A versão web deve mostrar todas as informações dos dados, já a versão mobile irá exibir apenas as informações mais importantes. Neste cenário, o desenvolvedor pode optar por endpoints distintos ou mesmo necessitar implementar filtros complexos. Entretanto, todo este processo pode ser facilitado com o auxílio do OData.

[  ![C# (C Sharp) - Introdução ao ASP.NET Core](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) - Introdução ao ASP.NET Core Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-avancado-introducao-ao-aspnet-core)

## OData

[Open Data Protocol (OData)](https://www.odata.org/) é um padrão que define boas práticas para a criação e consumo de APIs RESTful. Ele ajuda o desenvolvedor a focar nas regras de negócio da API, sem ter que se preocupar com a implementação de aspectos técnicos como media types, formatos de payload, opções de query, etc.

O seu uso requer apenas alterações pontuais no código, como veremos à seguir.

## Integrando o OData a uma API ASP.NET Core

Para exemplificar o uso do OData criaremos uma API [ASP.NET Core](https://www.treinaweb.com.br/blog/o-que-e-o-asp-net-core) simples:

```csharp
dotnet new webapi -n PessoaAPI

```

Que retornará apenas um recurso:

```csharp
public class Pessoa
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public int Idade { get; set; }

    public override string ToString() => Id + " - " + Nome + " - " + Idade;
}

```

Salvo na memória:

```csharp
public class PessoaRepository
{
    private static Dictionary pessoas = new Dictionary();

    public List GetAll(){
        return pessoas.Values.ToList();
    }

    public Pessoa Get(int id){
        return pessoas.GetValueOrDefault(id);
    }

    public void Add(Pessoa pessoa){
        pessoas.Add(pessoa.Id, pessoa);
    }

    public void Edit(Pessoa pessoa){
        pessoas.Remove(pessoa.Id);
        pessoas.Add(pessoa.Id, pessoa);
    }

    public void Delete(int id){
        pessoas.Remove(id);
    }
}

```

Com isso, terá apenas um controller:

```csharp
[ApiController]
[Route("[controller]")]
public class PessoaController : ControllerBase
{
    private readonly ILogger _logger;
    private readonly PessoaRepository _repository;

    public PessoaController(ILogger logger, PessoaRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    [HttpGet]
    public IEnumerable Get()
    {
        var pessoas = _repository.GetAll();
        return pessoas;
    }

    [HttpGet("{id}")]
    [ProducesResponseType(201)]
    [ProducesResponseType(400)]
    public ActionResult Get(int id)
    {
        var item = _repository.Get(id);
        if(item != null)
            return item;

        return NotFound();
    }

    [HttpPost]
    [ProducesResponseType(201)]
    [ProducesResponseType(400)]
    public ActionResult Post([FromBody] Pessoa value)
    {
        try
        {
            _repository.Add(value);
            return value;
        }
        catch(Exception)
        {
            return BadRequest();
        }
    }

    [HttpPut("{id}")]
    [ProducesResponseType(201)]
    [ProducesResponseType(400)]
    public ActionResult Put(int id, [FromBody] Pessoa value)
    {
        try
        {
            value.Id = id;
            _repository.Edit(value);

            return value;
        }
        catch(Exception)
        {
            return BadRequest();
        }
    }

    [HttpDelete("{id}")]
    [ProducesResponseType(200)]
    [ProducesResponseType(400)]
    public ActionResult Delete(int id)
    {
        try
        {   
            _repository.Delete(id);
            return Ok(new { Description = "Item removed" });
        }
        catch(Exception)
        {
            return BadRequest();
        }
    }
}

```

Para integrar o OData na aplicação, basta adicionar no projeto a dependência `Microsoft.AspNetCore.OData`:

```csharp
dotnet add package Microsoft.AspNetCore.OData

```

Também adicione a dependência `Microsoft.AspNetCore.Mvc.NewtonsoftJson`:

```csharp
dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson

```

No método `ConfigureServices`, o serviço do OData deve ser adicionado:

```csharp
public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient();
    services.AddControllers()
            .AddNewtonsoftJson();

    //Adiciona o OData
    services.AddOData();

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "PessoaAPI", Version = "v1" });
    });

}

```

Note que o `AddNewtonsoftJson()` não é adicionado. Isso é necessário porque o OData não funciona corretamente com o System.Text.Json.

E no método `Configure`, na configuração dos endpoints da aplicação, é necessário configurar o middleware do OData:

```csharp
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.EnableDependencyInjection();
    endpoints.Select().Filter().OrderBy();
});

```

O `EnableDependencyInjection()` permite a sobrescrita das URLs, desta forma não é necessário especificar uma separada para o OData.

O OData pode aplicar filtro, seleção, ordenação e outros recursos ao retorno da API, acima são habilitados a seleção, filtro e ordenação.

Entretanto, para que o OData funcione, por fim, é necessário adicionar o atributo `EnableQuery` nos métodos dos controllers onde ele será aplicado:

```csharp
[HttpGet]
[EnableQuery]
public IEnumerable Get()
{
    var pessoas = _repository.GetAll();
    return pessoas;
}

```

Caso tenha implementado Entity Framework e o DbContext é acessado no controller, substitua o `IEnumerable` pelo `IQueryable`. Assim, o OData irá utilizar as capacidades do Entity Framework para aplicar as seleções.

## Testando o OData na aplicação

Com o OData implementado na aplicação podemos testá-lo, para isso, a aplicação precisa conter alguns dados:

![Lista dos dados da API sem nenhum filtro](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/api_dados.png)

Neles, é possível aplicar uma seleção com o atributo `$select` na querystring do endpoint (`pessoa?$select=nome`):

![Lista dos dados da API com o filtro select](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/api_select.png)

Pode ser informado mais de uma propriedade, separando elas por vírgula (e.g.`pessoa?$select=nome,idade`).

O mesmo processo se aplica a ordenação, com o uso do atributo `$orderBy` (`pessoa?$orderBy=idade`):

![Lista dos dados da API com o filtro orderBy](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/api_orderby.png)

Já para o filtro, pode ser aplicado uma das condicões abaixo:

CondiçãoDescriçãoExemploeqIgual$filter=idade eq 18neDiferente$filter=idade ne 18gtMaior$filter=idade gt 18geMaior ou igual$filter=idade ge 18ltMenor$filter=idade lt 18leMenor ou igual$filter=idade le 18andE lógico$filter=idade gt 18 and idade lt 30orOu lógico$filter=idade gt 18 or idade lt 30notNegação lógica$filter=not endswith(nome,‘Silva’)

Por exemplo (`pessoa?$filter=idade gt 30`):

![Lista dos dados da API com o filtro filter](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/api_filter.png)

Por fim, também é possível combinar mais de um atributo na querystring (`pessoa?$select=nome&$filter=not endswith(nome,'Silva')`):

![Lista dos dados da API com os filtros de select e filter](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/api_select_filter.png)

[  ![C# (C Sharp) - APIs REST com ASP.NET Web API](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) - APIs REST com ASP.NET Web API Conhecer o curso ](https://www.treinaweb.com.br/curso/c-sharp-apis-rest-com-asp-net-web-api)

## Conclusão

Este artigo apenas introduz o OData, ele possui muitos recursos e merece sua atenção caso esteja trabalhando com APIs RESTful no ASP.NET Core.

Caso a API retorne uma grande quantidade de dados, a ordenação (`$orderBy`) e filtro (`$filter`) podem ser muito custosas, então nesta situação é necessário analisar se suas habilitações compensam. Se não, recomenda-se deixá-los inativos.

Nos próximos artigos abordei mais recursos do OData, até lá!

- [ #C# ](https://www.treinaweb.com.br/blog/tag/csharp)
- [ #API ](https://www.treinaweb.com.br/blog/tag/api)
- [ #ASP .NET Core ](https://www.treinaweb.com.br/blog/tag/asp-net-core)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/01125223/react-php-imagem-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Trabalhando com Sockets no ReactPHP ](https://www.treinaweb.com.br/blog/trabalhando-com-sockets-no-reactphp) 

     Veremos neste artigo como usar o componente de socket do ReactPHP para criar um chat pelo terminal. Além disso, veremos as bases para a construção de servidores TCP/IP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/MAPAS-DART-400x280.png)  [ Dart ](https://www.treinaweb.com.br/blog/categoria/dart) 

     6 anos atrás

    ##  [ Manipulando mapas no Dart ](https://www.treinaweb.com.br/blog/manipulando-mapas-no-dart) 

     Veja neste artigo como manipular mapas no Dart.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/lambda-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     7 anos atrás

    ##  [ O que é AWS Lambda? ](https://www.treinaweb.com.br/blog/o-que-e-aws-lambda) 

     Nesse artigo vamos conhecer o AWS Lambda, serviço de computação Serveless da AWS especializado em executar funções sem a necessidade de se preocupar com servidores.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/17132411/middlewares-aspnet-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     8 anos atrás

    ##  [ Criando um middleware customizado para ASP.NET Core ](https://www.treinaweb.com.br/blog/criando-um-middleware-customizado-para-asp-net-core) 

     Aprenda como criar e conheça as opções de configuração de um middleware customizado no ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/05/03175136/NET-CORE-2.1-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Global Tools no .NET Core 2.1 ](https://www.treinaweb.com.br/blog/global-tools-no-net-core-2-1) 

     Conheça o recurso de global tool adicionado na versão 2.1 do .NET Core e aprenda como definir uma a partir de um projeto console.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2025/01/NOVIDADES-REACT-19-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     2 anos atrás

    ##  [ 4 Novidades do React 19 ](https://www.treinaweb.com.br/blog/4-novidades-do-react-19) 

     Descubra 4 novidades do React 19, incluindo novos hooks, otimizações de performance e uso prático das Actions para formulários.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/04/24110903/O-QUE-E-REACT-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     3 anos atrás

    ##  [ Criando aplicações React com Vite e TypeScript ](https://www.treinaweb.com.br/blog/criando-aplicacoes-react-com-vite-e-typescript) 

     Neste artigo veremos como criar aplicações React com Vite, que permite desenvolvermos aplicações modernas com recursos como HMR, entre outros.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

     3 anos atrás

    ##  [ Cron jobs, timeouts e intervals com NestJS ](https://www.treinaweb.com.br/blog/cron-jobs-timeouts-e-intervals-com-nestjs) 

     Neste artigo vamos utilizar o módulo nativo scheduler do NestJS para trabalhar com tarefas automatizadas com cron jobs, timeouts e intervals

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/08/Como-alterar-o-font-family-do-site-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     3 anos atrás

    ##  [ Como alterar o font family do site ](https://www.treinaweb.com.br/blog/como-alterar-o-font-family-do-site) 

     Nesse artigo veremos como você pode alterar o font family de seu site. Aprenderemos também as diferentes possibilidades de fazê-lo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/08/07161700/gerenciamento-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     4 anos atrás

    ##  [ Empacotando e publicando pacotes Python no PyPi ](https://www.treinaweb.com.br/blog/empacotando-e-publicando-pacotes-python-no-pypi) 

     Neste artigo iremos aprender como funciona o processo de empacotar e distribuir nossos próprios pacotes Python no PyPi.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/PUB-DEV-400x280.jpg)  [ Flutter ](https://www.treinaweb.com.br/blog/categoria/flutter) 

     4 anos atrás

    ##  [ Gerenciador de pacotes Dart e Flutter ](https://www.treinaweb.com.br/blog/gerenciador-de-pacotes-dart-e-flutter) 

     Saiba o que é o gerenciador de pacotes Dart e Flutter, como utilizar um pacote, biblioteca instalada por ele e sobre o pubspec.yaml.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/20234042/capa-dart-400x280.png)  [ Dart ](https://www.treinaweb.com.br/blog/categoria/dart) 

     5 anos atrás

    ##  [ Como utilizar generics no Dart ](https://www.treinaweb.com.br/blog/como-utilizar-generics-no-dart) 

     Neste artigo vamos aprender sobre os Generics na linguagem Dart e como eles podem nos auxiliar em garantir que os tipos dos objetos sejam o que esperamos que eles sejam.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **12h 06min 54s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
