對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 支援的變更
相關內容
- SQL 除錯
- 使用調試程式 管理例外狀況
- LINQ 查詢簡介 (C#)
- Visual Basic LINQ 簡介