Отладка 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 Поддерживаемые изменения