Šta je OData?

OData (Open Data Protocol) je otvoreni standard za izgradnju i konzumiranje RESTful API servisa koji omogućavaju rad sa podacima putem HTTP protokola. Razvijen je pod okriljem kompanije Microsoft, a danas je OASIS standard.

U .NET svetu, OData se najčešće koristi zajedno sa:

ASP.NET Core

Entity Framework Core

Omogućava klijentima da kroz URL parametre filtriraju, sortiraju, grupišu i paginiraju podatke — bez potrebe za pisanjem dodatnih endpointa.

Zašto koristiti OData u C# aplikacijama?

U klasičnom REST API-ju često pravimo više endpointa poput:

/api/products

/api/products/by-category/3

/api/products/expensive

/api/products/paged?page=2

Sa OData pristupom, sve to postaje jedan endpoint:

/odata/Products

A klijent sam definiše upit:

/odata/Products?$filter=Price gt 1000&$orderby=Name&$top=10

Dakle, server izlaže podatke, a klijent bira kako želi da ih dobije.

Osnovne OData opcije (Query Options)

OData koristi standardne query parametre:

Parametar Opis
$filter Filtriranje podataka
$select Izbor kolona
$expand Učitavanje povezanih entiteta
$orderby Sortiranje
$top Ograničavanje broja rezultata
$skip Preskakanje zapisa (paginacija)
$count Vraćanje ukupnog broja zapisa

Primer:

/odata/Customers?$filter=City eq ‘Belgrade’&$select=Name,Email

Kako OData funkcioniše u C# (ASP.NET Core)

U modernim aplikacijama koristi se paket:

Microsoft.AspNetCore.OData

1️⃣ Instalacija NuGet paketa

U Package Manager konzoli:

Install-Package Microsoft.AspNetCore.OData

2️⃣ Konfiguracija u Program.cs
builder.Services.AddControllers()
.AddOData(options => options
.Select()
.Filter()
.OrderBy()
.Expand()
.Count()
.SetMaxTop(100)
.AddRouteComponents(“odata”, GetEdmModel()));

3️⃣ Kreiranje EDM modela
using Microsoft.OData.ModelBuilder;

static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet(“Products”);
return builder.GetEdmModel();
}

4️⃣ OData kontroler
using Microsoft.AspNetCore.OData.Query;
using Microsoft.AspNetCore.Mvc;

[Route(“odata/[controller]”)]
public class ProductsController : ControllerBase
{
private readonly AppDbContext _context;

public ProductsController(AppDbContext context)
{
_context = context;
}

[EnableQuery]
public IQueryable Get()
{
return _context.Products;
}
}

Ključna stvar je [EnableQuery] atribut koji omogućava OData parsiranje query parametara.

Veza sa Entity Framework Core

Kada vraćaš IQueryable, OData automatski prevodi URL query u LINQ izraz, a zatim:

LINQ → SQL → baza podataka

To znači da se filtriranje i sortiranje izvršava u bazi, a ne u memoriji aplikacije — što je veoma efikasno.

Prednosti OData

✔ Fleksibilan API
✔ Manje endpointa
✔ Standardizovan format
✔ Automatska paginacija i filtriranje
✔ Dobro se uklapa sa EF Core

Mane OData

❌ Može izložiti previše podataka ako se ne ograniči
❌ Potencijalno sporiji kompleksni upiti
❌ Veća kompleksnost validacije i sigurnosti
❌ Teže debugovanje u odnosu na klasičan REST

Kada koristiti OData?

OData je odličan izbor kada:

Praviš enterprise aplikaciju

Imaš kompleksne tabele i relacije

Koristiš Blazor ili SPA aplikaciju

Klijentima treba fleksibilno pretraživanje

Radiš sa BI ili reporting alatima

Nije idealan za:

Jednostavne mikroservise

API-je sa striktno definisanim endpointima

Javne API-je gde želiš potpunu kontrolu nad payload-om

Verzije OData

OData v3 (stara verzija, koristi se u starijim .NET aplikacijama)

OData v4 (moderni standard, koristi se u ASP.NET Core)

Primer realnog zahteva
GET /odata/Orders?$expand=Customer&$filter=Total gt 5000&$orderby=Date desc&$top=5

Ovo znači:

    učitaj porudžbine

    uključi kupca

    filtriraj iznose veće od 5000

    sortiraj po datumu opadajuće

    vrati 5 zapisa

    Sve bez dodatnog endpointa.

Zaključak

OData u C# aplikacijama omogućava izgradnju moćnog, fleksibilnog i standardizovanog API-ja uz minimalan dodatni kod. U kombinaciji sa ASP.NET Core i Entity Framework Core dobijaš skalabilno i efikasno rešenje za rad sa podacima.

Ako radiš enterprise sisteme, finansijske aplikacije ili kompleksne baze podataka — OData je ozbiljan kandidat

Facebook Comments

Leave a Reply