Ejecutar paso a paso y LINQ
Este tema se aplica a:
Edición |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
|||||
Pro, Premium y Ultimate |
Al depurar el código LINQ, la ejecución paso a paso presenta algunas diferencias de comportamiento que debe tener en cuenta.
LINQ a SQL
En LINQ a consultas SQL, el código de predicado supera al control del depurador. Por consiguiente, no se puede realizar la ejecución paso a paso en el código de predicado. Cualquier consulta que compila a un árbol de expresiones genera código que supera al control del depurador.
Ejecutar paso a paso en Visual Basic
Cuando se ejecuta paso a paso a través de un programa de Visual Basic y el depurador encuentra una declaración de consulta, no avanza en la declaración pero resalta la declaración completa como una instrucción única. Este comportamiento se produce porque la consulta no se evalúa hasta que se llama. Para obtener más información, vea Introducción a LINQ en Visual Basic.
Si recorre el código de ejemplo siguiente, el depurador resalta la declaración de consulta, o creación de consulta, como una instrucción única.
Function MyFunction(ByVal x As Char)
Return True
End Function
Sub Main()
'Query creation
Dim x = From it In "faoaoeua" _
Where MyFunction(it) _
Select New With {.a = it}
' Query execution
For Each cur In x
Console.WriteLine(cur.ToString())
Next
End Sub
Al avanzar de nuevo, el depurador resalta For Each cur In x. En el paso siguiente, avanza hasta la función MyFunction. Después de recorrer paso a paso MyFunction, ésta retrocede a Console.WriteLine(cur.ToSting()). En ningún punto se recorre paso a paso el código de predicado en la declaración de consulta, aunque el depurador evalúa ese código.
Reemplazar un predicado con una función para habilitar la ejecución paso a paso (Visual Basic)
Si tiene recorrer paso a paso el código de predicado con fines de depuración, puede reemplazar el predicado con una llamada a una función que contenga el código de predicado original. Por ejemplo, supongamos este código:
Dim items() as integer ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
' Get the even numbers
Dim query = From nextInt in items Where nextInt Mod 2 = 0 Select nextInt
For each item in query
Console.WriteLine(item)
Next
Puede mover el código de predicado a una nueva función, denominada IsEven:
Dim items () as integer ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
' Get the even numbers
Dim query = From nextInt in items Where IsEven(nextInt) Select nextInt
For each item in query
Console.WriteLine(item)
Next
...
Function IsEven(item As =Integer) as Boolean
Return item Mod 2 = 0
End Function
La consulta revisada llama a la función IsEven en cada paso a través de items. Puede usar las ventanas del depurador para ver si cada elemento cumple la condición especificada, y puede recorrer paso a paso el código en IsEven. El predicado en este ejemplo es bastante simple. Sin embargo, si tiene un predicado más complejo debe realizar la depuración, esta técnica puede ser muy útil.
Vea también
Conceptos
Introducción a las consultas LINQ (C#)
Introducción a LINQ en Visual Basic