Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een van de belangrijkste voordelen van LINQ (en LINQ naar XML) is dat gekoppelde query's zowel kunnen worden uitgevoerd als één query die groter en ingewikkelder is dan de gekoppelde query's.
Een gekoppelde query is een query die een andere query als bron gebruikt. In de volgende eenvoudige code query2 is query1 bijvoorbeeld de bron:
XElement root = new XElement("Root",
new XElement("Child", 1),
new XElement("Child", 2),
new XElement("Child", 3),
new XElement("Child", 4)
);
var query1 = from x in root.Elements("Child")
where (int)x >= 3
select x;
var query2 = from e in query1
where (int)e % 2 == 0
select e;
foreach (var i in query2)
Console.WriteLine("{0}", (int)i);
Dim root As New XElement("Root", New XElement("Child", 1), New XElement("Child", 2), New XElement("Child", 3), New XElement("Child", 4))
Dim query1 = From x In root.Elements("Child") Where CInt(x) >= 3x
Dim query2 = From e In query1 Where CInt(e) Mod 2 = 0e
For Each i As var In query2
Console.WriteLine("{0}", CInt(i))
Next
In dit voorbeeld wordt de volgende uitvoer gegenereerd:
4
Deze gekoppelde query biedt hetzelfde prestatieprofiel als het doorlopen van een gekoppelde lijst.
- De Elements as heeft in feite dezelfde prestaties als het doorlopen van een gekoppelde lijst. Elements wordt geïmplementeerd als een iterator met uitgestelde uitvoering. Dit betekent dat het wat extra werk doet naast het doorlopen van de gekoppelde lijst, zoals het aanmaken van het iterator-object en het bijhouden van de uitvoeringsstatus. Dit werk kan worden onderverdeeld in twee categorieën: het werk dat wordt uitgevoerd op het moment dat de iterator is ingesteld en het werk dat tijdens elke iteratie wordt uitgevoerd. Het installatiewerk is een kleine, vaste hoeveelheid werk en het werk dat tijdens elke iteratie wordt uitgevoerd, is evenredig aan het aantal items in de bronverzameling.
- In
query1, dewhere-clause (Wherein Visual Basic) zorgt ervoor dat de query de Where-methode aanroept. Deze methode wordt ook geïmplementeerd als een iterator. Het installatiewerk bestaat uit het instantiëren van de gemachtigde die verwijst naar de lambda-expressie, plus de normale installatie voor een iterator. Bij elke iteratie wordt de gemachtigde aangeroepen om het predicaat uit te voeren. Het installatiewerk en het werk dat tijdens elke iteratie wordt uitgevoerd, is vergelijkbaar met het werk dat wordt gedaan bij het itereren over de assen. - De
query1select-component zorgt ervoor dat de query de Select methode aanroept. Deze methode heeft hetzelfde prestatieprofiel als de Where methode. - In
query2, zowel dewherecomponent (Wherein Visual Basic) als deselectcomponent hebben hetzelfde prestatieprofiel als inquery1.
De iteratie door query2 is dus rechtstreeks evenredig met het aantal items in de bron van de eerste query, met andere woorden, in een lineair tijdsbestek.
Zie opbrengst voor meer informatie over iterators.
Zie Zelfstudie: Query's aan elkaar koppelen (C#) voor een gedetailleerdere zelfstudie over het koppelen van query's.