對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 簡介