共用方式為


對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 支援的變更