共用方式為


對LINQ進行偵錯

Visual Studio 支援語言整合式查詢 (LINQ) 程式代碼的偵錯,但有一些限制。 大部分的偵錯功能都適用於LINQ語句,包括逐步執行、設定斷點,以及在調試程式中檢視結果。 本主題描述LINQ偵錯的主要限制。

檢視 LINQ 結果

您可以使用 [資料提示]、[監看式] 視窗和 [快速監看式] 對話框來檢視 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 支援的變更