|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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. 33.4.1. Query ExpressionAan de hand van query methods zou men in onderstaand voorbeeld alle personen kunnen selecteren uit "New York" gesorteerd op hun naam. Visual Basic 2010 Broncode Option Infer OnOption Strict OnPublic Class Person Private m_Name As String Public Property Name() As String Get Return m_Name End Get Set( ByVal value As String) m_Name = value End Set End Property Private m_City As String Public Property City() As String Get Return m_City End Get Set( ByVal value As String) m_City = value End Set End Property Private m_IsMale As Boolean Public Property IsMale() As Boolean Get Return m_IsMale End Get Set( ByVal value As Boolean) m_IsMale = value End Set End Property Public Overrides Function ToString() As String ToString = "Female " If IsMale Then ToString = "Male " ToString &= Name & ", from " & City & "." End FunctionEnd ClassPublic 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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. boven
33.4.2. Option Infer OnHoewel 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 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Bo from New York
John from New York
Paul from New York boven
33.4.3. LINQ to ObjectsIn 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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|