Skip to main content

LINQ To DataSet Samples - Query Execution


ToLookup - element selector

The following sample shows how queries can be executed immediately with operators such as ToLookup().

Public Sub DataSetLinq108()

    Dim products = TestDS.Tables("Products").AsEnumerable()

    Dim productsLookup = products.ToLookup(Function(p) p("Category"))

    Dim confections = productsLookup("Confections")

    Console.WriteLine("Number of categories: {0}", productsLookup.Count)
    For Each product In confections
        Console.WriteLine("ProductName: {0}", product("ProductName"))
    Next
End Sub


Result:
Number of categories: 8
ProductName: Pavlova
ProductName: Teatime Chocolate Biscuits
ProductName: Sir Rodney's Marmalade
ProductName: Sir Rodney's Scones
ProductName: NuNuCa Nuß-Nougat-Creme
ProductName: Gumbär Gummibärchen
ProductName: Schoggi Schokolade
ProductName: Zaanse koeken
ProductName: Chocolade
ProductName: Maxilaku
ProductName: Valkoinen suklaa
ProductName: Tarte au sucre
ProductName: Scottish Longbreads


Immediate Execution

The following sample shows how queries can be executed immediately with operators such as ToList().

Public Sub DataSetLinq100()
    ' Methods like ToList() cause the query to be
    ' executed immediately, caching the results.

    Dim numbers = TestDS.Tables("Numbers").AsEnumerable()

    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


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 DataSetLinq101()
    ' Deferred execution lets us define a query once
    ' and then reuse it later after data changes.

    Dim numbers = TestDS.Tables("Numbers").AsEnumerable()
    Dim lowNumbers = From n In numbers _
        Where n!number <= 3 _
        Select n

    Console.WriteLine("First run numbers <= 3:")
    For Each n In lowNumbers
        Console.WriteLine(n!number)
    Next

    For i As Integer = 0 To TestDS.Tables("Numbers").Rows.Count - 1
        TestDS.Tables("Numbers").Rows(i)!number -= 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!number)
    Next

End Sub


Result:
First run numbers <= 3:
1
3
2
0
Second run numbers <= 3:
3
0
2
1
-1