Compartilhar via


Depurando LINQ

O Visual Studio dá suporte à depuração do código LINQ (consulta integrada à linguagem), com algumas limitações. A maioria dos recursos de depuração funciona com instruções LINQ, incluindo etapas, configuração de pontos de interrupção e exibição de resultados em janelas do depurador. Este tópico descreve as principais limitações da depuração LINQ.

Exibindo resultados do LINQ

Você pode visualizar o resultado de uma instrução LINQ usando DataTips, a janela Watch e a caixa de diálogo QuickWatch. Ao usar uma janela de origem, você pode pausar o ponteiro em uma consulta na janela de origem e uma Dica de Dados será exibida. Você pode copiar uma variável LINQ e colá-la na janela Assistir ou na caixa de diálogo QuickWatch.

No LINQ, uma consulta não é avaliada quando é criada ou declarada, mas somente quando a consulta é usada. Portanto, a consulta não tem um valor até ser avaliada. Para obter uma descrição completa da criação e avaliação da consulta, consulte Introdução às Consultas LINQ (C#) ou Escrevendo Sua Primeira Consulta LINQ.

Para exibir o resultado de uma consulta, o depurador deve avaliá-la. Essa avaliação implícita, que ocorre quando você exibe 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 levar a uma penalidade de desempenho visível.

  • Avaliar 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 colaterais. Para determinar se uma consulta pode ser avaliada com segurança sem efeitos colaterais, você deve entender o código que implementa a consulta.

Depuração e LINQ

Quando você está depurando o código LINQ, a execução em etapas tem algumas diferenças no comportamento que você deve conhecer.

LINQ to SQL

Em consultas LINQ to SQL, o código de predicado está fora do controle do depurador. Portanto, você não poderá entrar no código de predicado. Qualquer consulta compilada em uma árvore de expressão produz código que está além do controle do depurador.

Avançando no Visual Basic

Quando estiver depurando um programa do Visual Basic e o depurador encontrar uma declaração de consulta, ele não irá entrará na declaração, mas realçará a declaração inteira como uma única instrução. Esse comportamento ocorre porque a consulta não é avaliada até ser chamada. Para obter mais informações, consulte Introdução ao LINQ no Visual Basic.

Caso você passe pelo código de exemplo a seguir, o depurador realçará a declaração de consulta, ou a criação de consulta, como apenas uma 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

Ao passar novamente por uma etapa do código, o depurador realça For Each cur In x. Na próxima etapa, ele entra na função MyFunction. Depois de avançar por MyFunction, ele volta para Console.WriteLine(cur.ToSting()). Em nenhum ponto ele percorre o código de predicado na declaração de consulta, embora o depurador avalie aquele código.

Substituindo um predicado por uma função para habilitar a depuração (Visual Basic)

Se você precisar passar pelo código de predicado para fins de depuração, você poderá substituir o predicado por uma chamada a 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 do 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 por items. É possível usar as janelas de depuração para ver se cada item está de acordo com a condição especificada, e você pode percorrer o código em IsEven. O predicado neste exemplo é bastante simples. No entanto, se você tiver um predicado mais difícil que precisa depurar, essa técnica poderá ser muito útil.

"Edit and Continue" não é compatível com LINQ

Editar e Continuar dá suporte a alterações em consultas LINQ com limitações. Para obter detalhes, consulte Alterações Suportadas pelo EnC