Wat is LINQ method syntax?

LINQ Method Syntax is een functionele manier om gegevens te bevragen in C#. Het maakt gebruik van methoden zoals Where, Select, OrderBy, en GroupBy om collecties en databases te filteren, sorteren en transformeren.

Casus Declaratief vs. Imperatief Programmeren

Bij het ontwikkelen van een applicatie komt een programmeur voor de keuze tussen twee programmeerstijlen: declaratief en imperatief. Deze keuze heeft invloed op de leesbaarheid, onderhoudbaarheid en efficiëntie van de code.

De situatie
Een ontwikkelaar krijgt de taak om alle even getallen uit een lijst te filteren. Dit kan op twee manieren:

  1. Declaratieve aanpak
    De programmeur schrijft een expressie die beschrijft wat er moet gebeuren, zonder de details van de uitvoering te specificeren:
var evenNumbers = numbers.Where(n => n % 2 == 0);

Hier wordt simpelweg aangegeven: “Selecteer alle even getallen uit de lijst.” Hoe dit precies gebeurt, wordt overgelaten aan de LINQ-engine van C#.

  1. Imperatieve aanpak
    De programmeur kiest een meer stapsgewijze benadering en bepaalt zelf hoe de taak uitgevoerd moet worden:
List<int> evenNumbers = new List<int>();  
foreach (var n in numbers)  
{  
    if (n % 2 == 0)  
    {  
        evenNumbers.Add(n);  
    }  
}

Hier wordt elke stap handmatig gedefinieerd:

  • Een lege lijst aanmaken.
  • Door elk getal in de lijst itereren.
  • Controleren of het even is.
  • Het getal toevoegen aan de nieuwe lijst.

Analyse
De declaratieve aanpak is korter en leesbaarder, terwijl de imperatieve aanpak meer controle biedt, maar omslachtiger is. In moderne softwareontwikkeling wordt vaak de declaratieve stijl geprefereerd vanwege de eenvoud en efficiëntie.

Welke aanpak zou jij kiezen voor je volgende project?

Hoe zit LINQ method syntax in elkaar?

LINQ method syntax gebruikt method chaining en lambda-expressies om data te filteren, groeperen en transformeren. Je past methoden toe zoals Where(), Select(), OrderBy(), en GroupBy().

De basisstructuur ziet er als volgt uit:

var resultaat = bron.Where(voorwaarde).Select(element);

Dit bestaat uit:

  • Where(predicate): Filtert data op basis van een voorwaarde.
  • Select(selector): Geeft aan wat je als resultaat wilt krijgen.

Codevoorbeeld

Laten we een lijst van getallen nemen en alleen de even getallen selecteren.

int[] numbers = { 1, 2, 3, 4, 5, 6 };
 
// LINQ Method Syntax
var evenNumbers = numbers.Where(n => n % 2 == 0);

Uitleg codevoorbeeld

  1. numbers.Where(n => n % 2 == 0) → Houd alleen de even getallen over.
  2. De resulterende collectie bevat { 2, 4, 6 }.

Hoe gebruik je LINQ query syntax?

Sorteren met OrderBy

LINQ Method Syntax kan data sorteren met OrderBy() en OrderByDescending().

var sortedNumbers = numbers.OrderByDescending(n => n);

Hiermee sorteer je numbers aflopend. Zonder OrderByDescending() zou het oplopend sorteren.

Groeperen met GroupBy in LINQ Method Syntax

Met GroupBy() kun je gegevens groeperen op basis van een bepaalde eigenschap.

Codevoorbeeld: Groeperen van namen op basis van hun eerste letter

string[] namen = { "Anna", "Arjen", "Bart", "Bram", "Cindy" };
 
var groepen = namen.GroupBy(naam => naam[0]);

Uitleg codevoorbeeld

  • namen.GroupBy(naam => naam[0]) → groepeert de namen op de eerste letter.

Uitvoer:

  • Groep ‘A’: { “Anna”, “Arjen” }
  • Groep ‘B’: { “Bart”, “Bram” }
  • Groep ‘C’: { “Cindy” }

Joins in LINQ Method Syntax

Met Join() kun je gegevens uit twee verzamelingen combineren op basis van een gemeenschappelijke eigenschap.

var klantOrders = klanten.Join(orders,
    klant => klant.Id,
    order => order.KlantId,
    (klant, order) => new { klant.Naam, order.Product });

Uitleg codevoorbeeld

  • klanten.Join(orders, klant => klant.Id, order => order.KlantId, (klant, order) => new { klant.Naam, order.Product })
  • Combineert klanten met hun bestellingen.

Uitvoer:

  • Alice → Laptop
  • Bob → Telefoon

Left Join en Multiple Joins in LINQ Method Syntax

Een left join zorgt ervoor dat alle elementen uit de linker verzameling behouden blijven, zelfs als er geen overeenkomstige elementen in de rechter verzameling zijn.

C# ondersteunt geen directe Left Join, maar je kunt dit simuleren met GroupJoin() en SelectMany().

Left Join in LINQ Method Syntax

var klantOrders = klanten.GroupJoin(orders,
    klant => klant.Id,
    order => order.KlantId,
    (klant, klantGroep) => new { klant.Naam, Orders = klantGroep.DefaultIfEmpty() })
.SelectMany(k => k.Orders.DefaultIfEmpty(), (k, order) => new { k.Naam, Product = order?.Product ?? "Geen bestelling" });

Uitleg codevoorbeeld

  • GroupJoin() groepeert orders bij klanten.
  • SelectMany() combineert de gegevens en vult ontbrekende waarden aan met null.

Uitvoer:

  • Alice → Laptop
  • Bob → Telefoon
  • Charlie → Geen bestelling

Volgende stap: Oefeningen LINQ method syntax