Bagikan melalui


Penelusuran kesalahan LINQ

Visual Studio mendukung penelusuran kesalahan kode kueri terintegrasi bahasa komputer (LINQ), dengan beberapa batasan. Sebagian besar fitur penelusuran kesalahan bekerja dengan pernyataan LINQ, termasuk melangkah, mengatur titik henti, dan melihat hasil di jendela debugger. Topik ini menjelaskan batasan utama dari penelusuran kesalahan 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 dapat 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 tentang pembuatan dan evaluasi kueri, lihat Pengantar 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 debugger, memiliki beberapa efek yang harus Anda pertimbangkan:

  • Setiap evaluasi kueri membutuhkan waktu. Memperluas node hasil membutuhkan waktu. Untuk beberapa kueri, evaluasi berulang dapat mengakibatkan penalti performa yang nyata.

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

Melangkah dan LINQ

Saat Anda melakukan penelusuran kesalahan kode LINQ, melangkah memiliki beberapa perbedaan perilaku 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 kendali debugger.

Melangkah dalam Visual Basic

Ketika Anda melangkah melalui program Visual Basic dan debugger menemukan deklarasi kueri, itu tidak masuk ke dalam deklarasi tetapi menyoroti seluruh deklarasi sebagai satu pernyataan. Perilaku ini terjadi karena kueri tidak dievaluasi sampai dipanggil. Untuk informasi selengkapnya, lihat Pengantar LINQ di Visual Basic.

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

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 selanjutnya, debugger melangkah ke dalam fungsi MyFunction. Setelah melewati MyFunction, debugger melompat kembali ke Console.WriteLine(cur.ToSting()). Tidak ada gunanya melewati kode predikat dalam deklarasi kueri, meskipun debugger mengevaluasi kode itu.

Mengganti Predikat dengan Fungsi untuk Mengaktifkan Langkah (Visual Basic)

Jika Anda harus menelusuri kode predikat untuk tujuan penelusuran kesalahan, 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 lintasan 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 mendebug, 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