Entity Framework - Filtering

Geschreven door: op zaterdag 24 maart 2018

Leestijd:

Zoals besproken in het Entity Framework blog wordt EF gebruikt voor het ophalen van gegevens uit een database die bruikbaar zijn in dotnet. In de tabellen van een database staan meestal echter een grote hoeveelheid aan gegevens. Vaak is het niet nodig om al die gegevens op te halen en volstaat een klein deel van de opgeslagen informatie. Denk bijvoorbeeld aan een tabel waar producten in opgeslagen worden (zie figuur 1). Als alleen producten benodigd zijn welke onder een bepaalde categorie vallen heeft het geen zin om alle producten op te halen. Bovendien zorgt dit ervoor dat de webpagina waar deze gegevens voor benodigd zijn langer nodig heeft om te laden. Hiervoor willen we eigenlijk ‘filteren’ welke gegevens er worden opgehaald uit de database. In sql zijn hier een aantal manieren voor welke ook via Entity framework kunnen worden aangeroepen.

Figuur 1 - Voorbeeld gegevens van een tabel met producten

Figuur 1 - Voorbeeld gegevens van een tabel met producten

 

Kolommen filteren

Een tabel bestaat uit een aantal kolommen welke definiëren welke gegevens er in de tabel staan. Zo zou een product tabel kunnen bestaan uit een kolom voor de naam van product, de beschrijving, een afbeelding en een categorie (zie figuur 1 voor een visuele representatie). Elke rij in deze tabel bevat een product met bijbehorende gegevens. Wanneer de producten worden opgehaald zijn overigens niet altijd alle gegevens benodigd. Voor een overzicht van producten hoeft bijvoorbeeld de beschrijving niet getoond te worden. Hiervoor kan de ‘Select’ functie worden gebruikt. Hiermee is het mogelijk om aan te geven welke rijen uit een tabel moeten worden opgehaald. In figuur 2 is een voorbeeld te zien waarbij alleen de namen van alle producten worden opgehaald.


List<string> productNames = Database.Products.Select(p => p.Name).ToList();

Figuur 2 - Haal alle product namen op met behulp van Entity framework


SELECT Name FROM PRODUCTS;

Figuur 3 - Gegenereerde SQL van figuur 2

 

Rijen filteren

Naast het kiezen van kolommen is het ook mogelijk om te filteren op rijen. Zo is het bijvoorbeeld mogelijk om alleen de rijen met de categorie ‘pen’ terug te krijgen (zie figuur 4). Hiervoor wordt de ‘Where’ functie gebruikt. Deze maakt het mogelijk om per kolom limitaties of filters aan te geven. Zo kunnen de producten bijvoorbeeld ook gefilterd worden op naam of beschrijving.


List <Product> products = Database.Products.Where(p => p.Category == "Pen").ToList();

Figuur 4 - Haal de producten op die de categorie rood hebben


SELECT * FROM Products WHERE Category = 'pen';

Figuur 5 - Gegenereerde SQL van figuur 4

 

Aantal rijen

Naast het filteren is het ook mogelijk de hoeveelheid rijen die verkregen worden aan te passen. Hiervoor zijn de ‘Skip’ en ‘Take’ functies bedoeld. Met Take kan bijvoorbeeld opgegeven worden dat er maximaal 10 rijen met gegevens terug gegeven mogen worden. Skip geeft aan hoeveel rijen er vanaf het begin overgeslagen moeten worden (figuur 5). Skip 20, Take 10, zou dus betekenen dat van de gegevens uit de database de eerste 20 rijen worden overgeslagen en alleen de 10 rijen hierna worden opgehaald. Dit is zeer geschikt voor informatie die als pagina’s worden weergegeven. Denk bijvoorbeeld aan een categorie pagina met paginering waarop per keer 10 producten worden getoond. Wanneer er vervolgens op een pijl wordt geklikt wordt de volgende pagina geladen met hierop 10 nieuwe resultaten. Dit zou dus betekenen dat uit de tabel de eerste 10 producten worden overgeslagen en de volgende 10 worden opgehaald. Let op dat hierbij de volgorde waarin de producten staan dus ook belangrijk is. Meer hierover in een later blog.


List <Product> products = Database.Products.Skip(20).Take(10).ToList();

Figuur 6 - Haal 10 producten op en sla hierbij de eerste 20 producten over


SELECT * FROM Products OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

Figuur 7 - Gegenereerde SQL van figuur 6

 

Bij id

De laatste filteroptie die hier zal worden besproken is de ‘Find’ functie. Dit komt overeen met de Where functie behalve dat find alleen voor id’s werkt. Een id is een uniek nummer voor elke rij in de tabel (zoals te zien in figuur 1). Om naar een specifieke rij gegevens te verwijzen wordt in code vaak deze id gebruikt. Voor gemak bestaat hiervoor de find funcie om deze ene rij gegevens gemakkelijk  te kunnen ophalen. Er wordt dus ook altijd maar één product terug gegeven in tegenstelling tot voorgaande query’s waarbij altijd een lijst met 0 of meer producten werd teruggegeven.


Product product = Database.Find(1);

Figuur 8 - Haal het product op dat id 1 heeft


SELECT * FROM Products WHERE id = 1;

Figuur 9 - Gegenereerde SQL bij figuur 8

 

Doormiddel van filters is het dus mogelijk om heel specifiek de benodigde gegevens uit de database te halen. Het limiteren van de opgehaalde gegevens beïnvloed de snelheid van de website in positieve mate. Zowel de pagina waarop de gegevens worden getoond, als de website in zijn geheel voor alle gebruikers.


Andere blogartikelen

Bel 072 5345 888
Meer dan 40 bedrijven vertrouwen op ons
Allrig is de alles in een leverancier binnen de energie-industrie
Aliancys is een toonaangevend wereldwijd bedrijf actief in de verkoop van kwaliteitsharsen
ERIKS is een toonaangevende en innovatieve leverancier aan de procesindustrie en aan machinebouwers, die zowel de rol van specialist als die van brede MRO-leverancier vervult
Industrieel dienstverlener Heinen & Hopman Engineering uit Bunschoten is dé wereldwijde specialist op het gebied van klimaatbeheersing
Handicare is een internationale organisatie die ouderen helpt om hun dagelijks leven gemakkelijker te maken door het produceren van hoogwaardige trapliften
Onze Middelen en Technologieën
microsoft silver partner
Adobe partner
fd gazellen 2017
Google analytics
partners-logo.jpg
TelefoonE-mail

whitepaper-customer-selfservice-1.png

Bedien uw klanten optimaal met customer selfservice

Download de whitepaper