Depurando LINQ
O Visual Studio oferece suporte à depuração de código LINQ (Language Integrated Query), com algumas limitações. A maioria dos recursos de depuração funciona com instruções LINQ, incluindo passagem, definição de pontos de interrupção e a visualização de resultados em janelas do depurador. Este tópico descreve as principais limitações da depuração LINQ.
Visualizando resultados do LINQ
Você pode exibir o resultado de uma instrução LINQ usando DataTips, a janela Watch e a caixa de diálogo QuickWatch. Ao utilizares uma janela de origem, podes manter o ponteiro sobre uma consulta na janela de origem e aparecerá uma dica informativa. Você pode copiar uma variável LINQ e colá-la na janela Watch ou na caixa de diálogo QuickWatch.
No LINQ, uma consulta não é avaliada quando é criada ou declarada, mas apenas quando a consulta é usada. Portanto, a consulta não tem um valor até que seja avaliada. Para obter uma descrição completa da criação e avaliação de consultas, consulte Introdução às consultas LINQ (C#) ou Escrevendo sua primeira consulta LINQ.
Para exibir o resultado de uma consulta, o depurador deve avaliá-lo. Essa avaliação implícita, que ocorre quando você visualiza um resultado de consulta LINQ no depurador, tem alguns efeitos que você deve considerar:
Cada avaliação da consulta leva tempo. Expandir o nó de resultados leva tempo. Para algumas consultas, a avaliação repetida pode resultar em uma penalidade de desempenho percetível.
A avaliação de uma consulta pode resultar em efeitos colaterais, que são alterações no valor dos dados ou no estado do seu programa. Nem todas as consultas têm efeitos secundários. Para determinar se uma consulta pode ser avaliada com segurança sem efeitos colaterais, você deve entender o código que implementa a consulta.
Passo a passo e LINQ
Quando está a depurar o seu código LINQ, o passo a passo tem algumas diferenças comportamentais que deve conhecer.
LINQ para SQL
Em consultas LINQ to SQL, o código de predicado está fora do alcance do depurador. Portanto, você não pode aceder ao código de predicado. Qualquer consulta compilada em uma árvore de expressão produz código que está além do controle do depurador.
Revisão no Visual Basic
Quando você está passando por um programa do Visual Basic e o depurador encontra uma declaração de consulta, ele não entra na declaração, mas destaca a declaração inteira como uma única instrução. Esse comportamento ocorre porque a consulta não é avaliada até que seja chamada. Para obter mais informações, consulte Introdução ao LINQ no Visual Basic.
Se percorreres o código de exemplo a seguir, o depurador irá destacar a declaração da consulta, ou a criação da consulta, como uma única instrução.
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
Quando avanças novamente, o depurador destaca For Each cur In x
. Na próxima etapa, entra na função MyFunction
. Depois de passar por MyFunction
, ele salta de volta para Console.WriteLine(cur.ToSting())
. Em nenhum momento ele percorre o código de predicado na declaração de consulta, embora o depurador avalie esse código.
Substituindo um predicado por uma função para permitir a depuração passo a passo (Visual Basic)
Se você tiver que percorrer o código de predicado para fins de depuração, poderá substituir o predicado por uma chamada para uma função que contenha o código de predicado original. Por exemplo, suponha que você tenha 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
Você pode mover o código de predicado para uma nova função, chamada 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
A consulta revisada chama a função IsEven
em cada passagem pelo items
. Você pode usar as janelas do depurador para verificar se cada item atende à condição especificada e pode avançar passo a passo pelo código em IsEven
. O predicado neste exemplo é bastante simples. No entanto, se você tem um predicado mais difícil que você tem que depurar, esta técnica pode ser muito útil.
Editar e continuar não suportado para LINQ
Editar e Continuar suporta alterações em consultas LINQ com limitações. Para obter detalhes, consulte Alterações Suportadas pelo EnC