Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

26.3. LINQ - Language Integrated Query

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

LINQ (Language INtegrated Query) maakt het mogelijk via een SQL-achtige syntax queries toe te passen op bepaalde data.

Net als de For Each iteraties, die een verkorte notatie zijn voor het gebruik van de IEnumerable en IEnumerator methods, zijn ook de voorziene query expressies een synthactische toevoeging die het mogelijk maakt op eenvoudige wijze (en SQL-achtige manier) gebruik te maken van query methods.

LINQ is gebaseerd op bijna alle nieuwe features van de taal.  De vernieuwde objectinitializers, anonieme types, extension methods en lambda functies.

LINQ biedt een meer declaratieve manier om te specifiëren welke data je wil selecteren, in tegenstelling tot complexere algoritmes ( als iteraties met selecties) die eerder beschrijven hoe data wordt geselecteerd.

26.3.1. Query Expression

Aan de hand van query methods zou men in onderstaand voorbeeld alle personen kunnen selecteren uit "New York" gesorteerd op hun naam.
Visual Basic 2012 Broncode - Codevoorbeeld 680
Option Infer On
Option Strict On
Public Class Person
    Public Property Name As String
    Public Property City As String
    Public Property IsMale As Boolean
    Public Overrides Function ToString() As String
        ToString = "Female "
        If IsMale Then ToString = "Male "
        ToString &= Name & ", from " & City & "."
    End Function
End Class
Public Class Example1
    Public Shared Sub Main()
        Dim persons As Person() = New Person() { _
          New Person With {.Name = "John", .City = "New York", .IsMale = True}, _
          New Person With {.Name = "Bo", .City = "New York", .IsMale = False}, _
          New Person With {.Name = "Jane", .City = "London", .IsMale = False}, _
          New Person With {.Name = "Paul", .City = "New York", .IsMale = True}}
        '
        Dim personsNY As IEnumerable(Of Person) = _
                     persons.Where(Function(person) person.City = "New York") _
                            .OrderBy(Function(person) person.Name) _
                            .Select(Function(person) person)
        '
        For Each person As Person In personsNY
            Console.WriteLine(person)
        Next
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Female Bo, from New York.
Male John, from New York.
Male Paul, from New York.
Hetzelfde resultaat kunnen we bekomen aan de hand van een query expressie.
Visual Basic 2012 Broncode - Codevoorbeeld 681
Public Class Example2
    Public Shared Sub Main()
        Dim persons As Person() = New Person() { _
          New Person With {.Name = "John", .City = "New York", .IsMale = True}, _
          New Person With {.Name = "Bo", .City = "New York", .IsMale = False}, _
          New Person With {.Name = "Jane", .City = "London", .IsMale = False}, _
          New Person With {.Name = "Paul", .City = "New York", .IsMale = True}}
        '
        Dim personsNY As IEnumerable(Of Person) = _
                                                From person In persons _
                                                Where person.City = "New York" _
                                                Order By person.Name _
                                                Select person
        '
        For Each person As Person In personsNY
            Console.WriteLine(person)
        Next
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Female Bo, from New York.
Male John, from New York.
Male Paul, from New York.
De query expressie is duidelijk een stuk korter, en eenvoudiger te formuleren.

Deze expressie wordt vertaald naar het gebruik van de query methods als in vorige voorbeeld is gedemonstreerd.

In de query expressies kunnen SQL-achtige operators als Where, Select, Group By, Order By, Then By, ... gebruikt worden.
Onthoud wel dat net zoals voor het rechtstreekse gebruik van de query methods, men ook hier de System.Linq namespace moet importeren.  Indien zo, zijn de onderliggende query methods in scope, en kunnen ze ook gebruikt worden.

Bemerk hoe de query syntax toch nog iets anders is dan in de meeste SQL dialecten.
Hier begint elke query expressie met een From clausule en eindigt met een Select of Group By clausule.  De From clausule specificeert waaruit informatie wordt gehaald, en introduceert scope-gewijs ook een variabele die in de query expression kan gebruikt worden om naar een element uit de data te verwijzen.

26.3.2. Option Infer On

Hoewel het compileren van bovenstaande voorbeelden kan onder Option Infer Off, is dat niet altijd het geval.

Als we in onderstaand voorbeeld in de Select clause aangeven dat we enkel geïnteresseerd zijn in de naam en stad van de geselecteerde personen, is Option Infer On noodzakelijk.

De selector projecteert hier immers de resultaten in een anoniem type, waardoor het resultaat van de query IEnumerable(Of some-anonymous type) zal zijn.  Je kan in een type specifier niet verwijzen naar een anoniem type, waardoor hier Option Infer On noodzakelijk wordt.
Visual Basic 2012 Broncode - Codevoorbeeld 682
Public Class Example3
    Public Shared Sub Main()
        Dim persons = New Person() { _
          New Person With {.Name = "John", .City = "New York", .IsMale = True}, _
          New Person With {.Name = "Bo", .City = "New York", .IsMale = False}, _
          New Person With {.Name = "Jane", .City = "London", .IsMale = False}, _
          New Person With {.Name = "Paul", .City = "New York", .IsMale = True}}
        '
        Dim personNamesAndCitiesNY = From person In persons _
                                     Where person.City = "New York" _
                                     Order By person.Name _
                                     Select person.Name, person.City
        '
        For Each personNameAndCity In personNamesAndCitiesNY
            Console.WriteLine(personNameAndCity.Name & " from " & _
                              personNameAndCity.City)
        Next
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Bo from New York
John from New York
Paul from New York

26.3.3. LINQ to Objects

In bovenstaande voorbeelden worden de query expressies gebruikt om elementen te filteren uit collecties van objecten.  Zolang deze collecties IEnumerable of IEnumerable(Of T) zijn, kunnen men deze met LINQ querieën.  Men spreekt in dit geval van "LINQ to objects".

LINQ kan ook gebruikt worden op andere types van data (zoals relationele data ("LINQ to ADO.NET" ("LINQ to SQL" en "LINQ to DataSet") en "LINQ to Entity") of XML ("LINQ to XML")).  Zolang een LINQ provider of API is gedefinieerd, die aangeeft hoe de queries worden geëvalueerd op desbetreffende datasource, kunnen dezelfde query expressies ook daar worden gebruikt.  Dit biedt ons een uniforme manier om met verschillende types van data om te gaan.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.