다음을 통해 공유


LINQ 디버깅

Visual Studio는 몇 가지 제한 사항과 함께 LINQ(언어 통합 쿼리) 코드의 디버깅을 지원합니다. 대부분의 디버깅 기능은 디버거 창에서 단계별 실행, 중단점 설정, 결과 보기 등 LINQ 문에서 작동합니다. 이 항목에서는 LINQ 디버깅의 주요 제한 사항에 대해 설명합니다.

LINQ 결과 보기

DataTips, Watch 창 및 QuickWatch 대화 상자를 사용하여 LINQ 문의 결과를 볼 수 있습니다. 원본 창을 사용하는 경우 원본 창의 쿼리에서 포인터를 일시 중지할 수 있으며 DataTip이 표시됩니다. LINQ 변수를 복사하여 조사식 창 또는 빠른 조사식 대화 상자에 붙여넣을 수 있습니다.

LINQ에서 쿼리는 만들거나 선언할 때 평가되지 않고 쿼리를 사용하는 경우에만 평가됩니다. 따라서 쿼리는 평가될 때까지 값이 없습니다. 쿼리 생성 및 평가에 대한 전체 설명은 LINQ 쿼리 소개(C#) 또는 첫 번째 LINQ 쿼리 작성하기를 참조하세요.

쿼리 결과를 표시하려면 디버거가 쿼리를 평가해야 합니다. 이 암시적 평가는 디버거에서 LINQ 쿼리 결과를 볼 때 발생하며 고려해야 할 몇 가지 효과가 있습니다.

  • 쿼리의 각 평가에는 시간이 걸립니다. 결과 노드를 확장하는 데 시간이 걸립니다. 일부 쿼리의 경우 평가가 반복되면 성능이 저하될 수 있습니다.

  • 쿼리를 평가하면 부작용이 발생할 수 있으며, 이는 데이터 값 또는 프로그램 상태에 대한 변경입니다. 모든 쿼리에 부작용이 있는 것은 아닙니다. 쿼리를 부작용 없이 안전하게 평가할 수 있는지 여부를 확인하려면 쿼리를 구현하는 코드를 이해해야 합니다.

단계별 실행 및 LINQ

LINQ 코드를 디버깅하는 경우 단계별로 알아야 할 몇 가지 동작 차이점이 있습니다.

LINQ to SQL

LINQ to SQL 쿼리에서 조건자 코드는 디버거를 제어할 수 없습니다. 따라서 조건자 코드를 한 단계씩 실행할 수 없습니다. 식 트리로 컴파일되는 쿼리는 디버거를 제어할 수 없는 코드를 생성합니다.

Visual Basic 단계별 실행

Visual Basic 프로그램을 단계별로 실행할 때 디버거가 쿼리 선언을 만나면, 선언 내부로 이동하지 않고 전체 선언을 단일 문으로 강조 표시합니다. 이 동작은 쿼리가 호출될 때까지 평가되지 않기 때문에 발생합니다. 자세한 내용은 Visual Basic에서의 LINQ 소개을 참조하세요.

다음 예제 코드를 단계별로 실행하면 디버거에서 쿼리 선언 또는 쿼리 생성을 단일 문으로 강조 표시합니다.

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

수정된 쿼리는 items통과할 때마다 IsEven 함수를 호출합니다. 디버거 창을 사용하여 각 항목이 지정된 조건을 충족하는지 여부를 확인할 수 있으며 IsEven코드를 단계별로 실행할 수 있습니다. 이 예제의 조건자는 매우 간단합니다. 그러나 디버그해야 하는 더 어려운 조건자가 있는 경우 이 기술은 매우 유용할 수 있습니다.

LINQ에 대해 편집 및 계속이 지원되지 않음

편집하며 계속하기는 LINQ 쿼리의 변경을 제한적으로 지원합니다. 자세한 내용은 EnC 지원 변경 사항를 참조하세요.