Bagikan melalui


Penelusuran kesalahan LINQ

Visual Studio mendukung penelusuran kesalahan kode kueri terintegrasi bahasa (LINQ), dengan beberapa batasan. Sebagian besar fitur penelusuran kesalahan berfungsi dengan pernyataan LINQ, termasuk melangkah, mengatur titik henti, dan melihat hasil di jendela debugger. Topik ini menjelaskan batasan utama debugging LINQ.

Menampilkan Hasil LINQ

Anda dapat melihat hasil pernyataan LINQ dengan menggunakan DataTips, jendela Watch, dan kotak dialog QuickWatch. Saat Anda menggunakan jendela sumber, Anda bisa menjeda penunjuk pada kueri di jendela sumber dan DataTip akan muncul. Anda dapat menyalin variabel LINQ dan menempelkannya ke jendela Watch atau kotak dialog QuickWatch.

Di LINQ, kueri tidak dievaluasi saat dibuat atau dideklarasikan, tetapi hanya saat kueri digunakan. Oleh karena itu, kueri tidak memiliki nilai sampai dievaluasi. Untuk deskripsi lengkap pembuatan dan evaluasi kueri, lihat Pengenalan Kueri LINQ (C#) atau Menulis Kueri LINQ Pertama Anda.

Untuk menampilkan hasil kueri, debugger harus mengevaluasinya. Evaluasi implisit ini, yang terjadi saat Anda melihat hasil kueri LINQ di dalam debugger, memiliki beberapa efek yang harus Anda pertimbangkan.

  • Setiap evaluasi kueri membutuhkan waktu. Memperluas simpul hasil membutuhkan waktu. Untuk beberapa kueri, evaluasi berulang dapat mengakibatkan penurunan kinerja yang nyata.

  • Mengevaluasi kueri dapat mengakibatkan efek samping, yang merupakan perubahan pada nilai data atau status program Anda. Tidak semua kueri memiliki efek samping. Untuk menentukan apakah kueri dapat dievaluasi dengan aman tanpa efek samping, Anda harus memahami kode yang mengimplementasikan kueri.

Melangkah dan LINQ

Ketika Anda men-debug kode LINQ, langkah-langkah memiliki perilaku berbeda yang harus Anda ketahui.

LINQ ke SQL

Dalam kueri LINQ ke SQL, kode predikat berada di luar kendali debugger. Oleh karena itu, Anda tidak dapat masuk ke kode predikat. Setiap kueri yang dikompilasi ke pohon ekspresi menghasilkan kode yang berada di luar kontrol debugger.

Melangkah di Visual Basic

Ketika Anda melangkah melalui program Visual Basic dan debugger menemui deklarasi kueri, itu tidak memasuki deklarasi tetapi menyoroti seluruh deklarasi sebagai pernyataan tunggal. Perilaku ini terjadi karena kueri tidak dievaluasi sampai dipanggil. Untuk informasi selengkapnya, lihat Pengenalan LINQ di Visual Basic.

Jika Anda menelusuri contoh kode berikut, debugger menyoroti deklarasi kueri, atau pembuatan kueri, sebagai pernyataan tunggal.

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

Ketika Anda melangkah lagi, debugger menyoroti For Each cur In x. Pada langkah berikutnya, ia melangkah ke fungsi MyFunction. Setelah melangkah melalui MyFunction, ia melompat kembali ke Console.WriteLine(cur.ToSting()). Tidak ada gunanya melangkah melalui kode predikat dalam deklarasi kueri, meskipun debugger memang mengevaluasi kode tersebut.

Mengganti Predikat dengan Fungsi untuk Mengaktifkan Langkah (Visual Basic)

Jika Anda harus menelusuri kode predikat untuk tujuan pemecahan masalah, Anda dapat mengganti predikat dengan panggilan ke fungsi yang berisi kode predikat asli. Misalnya, Anda memiliki kode ini:

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

Anda dapat memindahkan kode predikat ke fungsi baru, yang disebut 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

Kueri yang direvisi memanggil fungsi IsEven pada setiap iterasi melalui items. Anda dapat menggunakan jendela debugger untuk melihat apakah setiap item memenuhi kondisi yang ditentukan, dan Anda dapat menelusuri kode di IsEven. Predikat dalam contoh ini cukup sederhana. Namun, jika Anda memiliki predikat yang lebih sulit, Anda harus melakukan debug, teknik ini bisa sangat berguna.

Edit dan Lanjutkan Tidak Didukung untuk LINQ

Edit dan Lanjutkan mendukung perubahan pada kueri LINQ dengan batasan. Untuk detailnya, lihat Perubahan yang Didukung EnC