Odata V4 filtering

Auteur Koen van der Fluit 20 mei 2022Leestijd: 3 minuten

In mijn vorige blog over de Introductie van Odata V4 zijn we geëindigd met een opsomming over de verschillende mogelijkheden rondom het querien met Odata V4. Deze blog zal verder in gaan op het kunnen $filteren van  gewenste data d.m.v. vergelijkende en logische operatoren.

Lagere code complexiteit door beter uitgewerkte query

Odata V4 heel veel ingebouwde functionaliteiten te bieden heeft rondom het filteren van end-point (mits gesteld door de aanbieder van de API). Dit verkleind de kans dat er specifieke end-points moeten worden opgezet voor het ophalen en verwerken van gegevens. In het volgende C# voorbeeld hieronder is te zien hoe minimalistisch een end-point opgezet kan worden:

/// <summary>
/// Enables OData queries on the returned vehicles.
/// Query information: https://docs.microsoft.com/en-us/odata/concepts/queryoptions-overview
/// </summary>
[EnableQuery]
public IQueryable<Vehicle> Get()
{
       IQueryable<Vehicle> result = _context.vehicles;
       return result;
}

* Door alleen [EnableQuery] te gebruiken, worden alle query opties beschikbaar gesteld! Voor externe API's wordt aangeraden om alleen opties beschikbaar te stellen waar de eind-gebruiker mogelijk behoefte aan heeft. Dit kan mogelijk fout/fraudulent gebruik voorkomen.

Dit algemene end-point kan nu verschillende rollen tegelijkertijd vervullen. Zo kan dit end-point dienen als de bron van informatie voor een overzichtspagina voor het beheer van de voertuigen, terwijl het ook gebruikt kan worden voor het reduceren van de resultaat set op basis van filters die een klant invult op de website. Hiermee verplaatsen we de complexiteit in de backend naar de query opzet in de front-end.

Vergelijkende en logische operatoren

Door de resultaten die we terug krijgen van een Odata query te filteren, kunnen we de resultaatset verkleinen of specificeren naar de gewenste set. Dit kan bijvoorbeeld gebruikt worden bij de volgende use-cases:

Specifieke objecten ophalen die onderscheiden kunnen worden door een type.

In de praktijk zijn er vele scenario's mogelijk waarbij er een type gebruikt kan worden om zo onderscheid te maken. Voor dit voorbeeld zal er gebruik gemaakt worden van een object: blog met daarin een seizoenstype. Dit seizoenstype bevat: lente, zomer, herfst en de winter.

Als we alleen de blogs uit de zomer willen ophalen kunnen we hier de eq (equel) vergelijkingsoperator gebruiken. Hiermee kunnen we de volgende query opbouwen:

~/odata/blogs?filter= type eq 'zomer'

Wat alle blogs zal opleveren van het type zomer. In tegenstelling tot de eq (equel) operator kan dezelfde query ook opgebouwd worden met de ne (not equel) operator. Dit kan gebruikt worden om bijvoorbeeld alle blogs op te halen die uit alle seizoenen komen behalve die van de zomer:

~/odata/blogs?filter=type ne 'zomer'

Naast de directe vergelijking met eq en ne. is het ook mogelijk om enum vergelijking uite te voeren met has:

~/odata/blogs?filter=type has blogs.type'zomer'

Specifieke waarden vereisen van een object

Een van de use-cases hiervoor kan zijn dat we een klant producten willen aanbieden die liggen binnen zijn prijs selectie. voor dit voorbeeld maken we gebruik van een product met een prijs.

Hiervoor kunnen we gebruik maken van de volgende vergelijkingsoperatoren (eq en nq kunnen hiervoor ook gebruikt worden):

  1. gt  (groter dan)
  2. ge (groter of dan of gelijk aan)
  3. lt   (minder dan)
  4. le  (minder dan of gelijk aan)

Met deze operatoren kunnen we een klant bijvoorbeeld een prijs aanbieden tussen de 50,- en 100,-. Om twee vergelijkingen te kunnen doen, kan er gebruikt gemaakt worden van de volgende logische operatoren:

  1. and  (en)
  2. or (of)
  3. not (niet)

~/odata/products?filter=price ge 50 and price le 100

Vervolg

In de volgende blog van deze serie zal er in gegaan worden op de ingebouwde string filter functies van Odata V4

bronnen:

1. Odata V4.0.1 documentatie

Open Nieuwsbrief Inschrijving Footer