Depurar LINQ
Visual Studio admite la depuración del código de consulta integrada de lenguaje (LINQ), con algunas limitaciones. La mayoría de las características de depuración funcionan con instrucciones LINQ, como la ejecución paso a paso, la configuración de puntos de interrupción y la visualización de los resultados en las ventanas del depurador. En este tema se describen las principales limitaciones de la depuración LINQ.
Visualización de los resultados de LINQ
Puede ver el resultado de una instrucción LINQ mediante DataTips, la ventana Watch y el cuadro de diálogo Inspección rápida. Al usar una ventana de código fuente, puede pausar el puntero en una consulta en la ventana de código fuente para que aparezca una información sobre datos. Puede copiar una variable LINQ y pegarla en la ventana de Inspección o en el cuadro de diálogo Inspección Rápida.
En LINQ, una consulta no se evalúa cuando se crea o declara, pero solo cuando se usa la consulta. Por lo tanto, la consulta no tiene un valor hasta que se evalúa. Para obtener una descripción completa de la creación y evaluación de consultas, vea Introducción a las consultas LINQ (C#) o Escribir la primera consulta LINQ.
Para mostrar el resultado de una consulta, el depurador debe evaluarlo. Esta evaluación implícita, que se produce cuando se ve un resultado de consulta LINQ en el depurador, tiene algunos efectos que debe tener en cuenta:
Cada evaluación de la consulta tarda tiempo. La expansión del nodo de resultados tarda tiempo. Para algunas consultas, la evaluación repetida podría producir una reducción del rendimiento notable.
Evaluar una consulta puede dar lugar a efectos secundarios, que son cambios en el valor de los datos o en el estado del programa. No todas las consultas tienen los efectos secundarios. Para determinar si una consulta puede evaluarse de forma segura sin efectos secundarios, debe comprender el código que implementa la consulta.
Paso a paso y LINQ
Si depura código LINQ, la ejecución paso a paso presenta algunas diferencias de comportamiento que debe conocer.
LINQ to SQL
En las consultas LINQ to SQL, el código de predicado está fuera del control del depurador. Por consiguiente, no se puede realizar la ejecución paso a paso en el código de predicado. Cualquier consulta que se compila en un árbol de expresiones genera código que está fuera del 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 es llamada. 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, pasa a 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 que tiene 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 de este ejemplo es bastante sencillo. Sin embargo, si tiene un predicado más difícil que depurar, esta técnica puede ser muy útil.
La funcionalidad de Editar y Continuar no es compatible con LINQ
Editar y continuar admite cambios en las consultas LINQ con limitaciones. Para más información, vea Cambios admitidos en EnC.