LINQ Query Samples - Query ExecutionOn This Page |
The following sample shows how query execution is deferred until the query is enumerated at a for each statement.
Public Sub Linq99()
' Sequence operators form first-class queries that
' are not executed until you enumerate over them.
Dim numbers() As Integer = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0}
Dim i As Integer = 0
Dim q = From n In numbers _
Select Increment(i)
' Note, the local variable 'i' is not incremented
' until each element is evaluated (as a side-effect):
For Each v In q
Console.WriteLine("v = " & v & ", i = " & i)
Next
End Sub
Function Increment(ByRef i As Integer) As Integer
i += 1
Return i
End Function
Result:
v = 1, i = 1
v = 2, i = 2
v = 3, i = 3
v = 4, i = 4
v = 5, i = 5
v = 6, i = 6
v = 7, i = 7
v = 8, i = 8
v = 9, i = 9
v = 10, i = 10
The following sample shows how queries can be executed immediately with operators such as ToList().
Public Sub Linq100()
' Methods like ToList() cause the query to be
' executed immediately, caching the results.
Dim numbers() As Integer = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0}
Dim i As Integer = 0
Dim q = (From n In numbers _
Select Increment(i)).ToList()
' The local variable i has already been fully
' incremented before we iterate the results:
For Each v In q
Console.WriteLine("v = " & v & ", i = " & i)
Next
End Sub
Function Increment(ByRef i As Integer) As Integer
i += 1
Return i
End Function
Result:
v = 1, i = 10
v = 2, i = 10
v = 3, i = 10
v = 4, i = 10
v = 5, i = 10
v = 6, i = 10
v = 7, i = 10
v = 8, i = 10
v = 9, i = 10
v = 10, i = 10
The following sample shows how, because of deferred execution, queries can be used again after data changes and will then operate on the new data.
Public Sub Linq101()
' Deferred execution lets us define a query once
' and then reuse it later after data changes.
Dim numbers() As Integer = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0}
Dim lowNumbers = From n In numbers _
Where n <= 3 _
Select n
Console.WriteLine("First run numbers <= 3:")
For Each n In lowNumbers
Console.WriteLine(n)
Next
For i As Integer = 0 To numbers.Length - 1
numbers(i) -= 1
Next
' During this second run, the same query object,
' lowNumbers, will be iterating over the new state
' of numbers(), producing different results:
Console.WriteLine("Second run numbers <= 3:")
For Each n In lowNumbers
Console.WriteLine(n)
Next
End Sub
Result:
First run numbers <= 3:
1
3
2
0
Second run numbers <= 3:
3
0
2
1
-1