Поделиться через


Отладка LINQ

Visual Studio поддерживает отладку кода интегрированного языка (LINQ) с некоторыми ограничениями. Большинство функций отладки работают с операторами LINQ, включая пошаговое выполнение, установку точек останова и отображение результатов в окнах отладчика. В этом разделе описываются основные ограничения отладки LINQ.

Просмотр результатов LINQ

Результат инструкции LINQ можно просмотреть с помощью подсказок данных, окна "Контроль" и диалогового окна "Быстрый просмотр". При использовании исходного окна можно приостановить указатель на запрос в исходном окне и появится подсказка данных. Вы можете скопировать переменную LINQ и вставить ее в диалоговое окно "Контрольные" или "Быстрые часы".

В LINQ запрос не вычисляется при его создании или объявлении, но только при использовании запроса. Поэтому запрос не имеет значения, пока он не будет оценен. Полное описание создания и оценки запросов см. в разделе Введение в запросы LINQ (C#) или Написание вашего первого запроса LINQ.

Чтобы отобразить результат запроса, отладчик должен оценить его. Эта неявная оценка, которая возникает при просмотре запроса LINQ в отладчике, имеет некоторые последствия, которые следует учитывать:

  • Каждая оценка запроса занимает время. Развертывание узла результатов занимает время. Для некоторых запросов повторная оценка может привести к заметному снижению производительности.

  • Оценка запроса может привести к побочным эффектам, которые изменяют значение данных или состояние программы. Не все запросы имеют побочные эффекты. Чтобы определить, может ли запрос безопасно оцениваться без побочных эффектов, необходимо понять код, реализующий запрос.

Пошаговое выполнение и LINQ

При отладке кода LINQ пошаговое выполнение имеет некоторые особенности в поведении, о которых вы должны знать.

LINQ to SQL

В запросах LINQ to SQL код предиката выходит за рамки управления отладчиком. Таким образом, нельзя перейти к коду предиката. Любой запрос, который компилируется в дерево выражений, создает код, который выходит за рамки управления отладчиком.

Пошаговое выполнение в Visual Basic

При пошаговом выполнении программы Visual Basic, когда отладчик сталкивается с объявлением запроса, он не заходит в него, а выделяет всё объявление как единую инструкцию. Это происходит, так как запрос не вычисляется, пока он не вызывается. См. статью Введение в LINQ в Visual Basicдля получения дополнительных сведений.

При пошаговом выполнении следующего примера кода отладчик выделяет объявление запроса или создание запроса в виде одной инструкции.

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

При повторном шаге отладчик выделяет For Each cur In x. На следующем шаге он переходит в функцию MyFunction. После шага через MyFunctionон прыгает обратно в Console.WriteLine(cur.ToSting()). Ни в какой момент не выполняется шаг через код предиката в объявлении запроса, хотя отладчик вычисляет этот код.

Замена предиката функцией для включения пошагового выполнения (Visual Basic)

Если необходимо выполнить пошаговое выполнение кода предиката для отладки, можно заменить предикат вызовом функции, содержащей исходный код предиката. Например, предположим, что у вас есть следующий код:

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

Код предиката можно переместить в новую функцию с именем 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

Измененный запрос вызывает функцию IsEven для каждого прохода через items. Окна отладчика можно использовать для проверки того, соответствует ли каждый элемент указанному условию, а также можно пошагово выполнить код в IsEven. Предикат в этом примере довольно прост. Однако если у вас есть более сложный предикат, который вам нужно отладить, этот метод может быть очень полезным.

Изменение и продолжение не поддерживается для LINQ

Функция 'Изменить и продолжить' поддерживает изменения в запросах LINQ с некоторыми ограничениями. См. информацию о поддерживаемых изменениях EnC в