Skip to main content

LINQ Query Samples - Query Execution


Deferred Execution

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


Immediate Execution

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


Query Reuse

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