Aracılığıyla paylaş


LINQ hatalarını ayıklama

Visual Studio, bazı sınırlamalarla birlikte dil tümleşik sorgu (LINQ) kodunda hata ayıklamayı destekler. Hata ayıklama özelliklerinin çoğu, adımlama, kesme noktalarını ayarlama ve hata ayıklayıcı pencerelerindeki sonuçları görüntüleme gibi LINQ deyimleriyle çalışır. Bu konu başlığında LINQ hata ayıklamanın başlıca sınırlamaları açıklanmaktadır.

LINQ Sonuçlarını Görüntüleme

DataTips, Watch penceresi ve QuickWatch iletişim kutusunu kullanarak LINQ deyiminin sonucunu görüntüleyebilirsiniz. Kaynak pencere kullandığınızda, işaretçiyi kaynak penceresindeki bir sorgunun üzerinde duraklatabilirsiniz ve Bir Veri İpucu görüntülenir. LINQ değişkenini kopyalayıp Gözcü penceresine veya QuickWatch iletişim kutusuna yapıştırabilirsiniz.

LINQ'te, sorgu oluşturulduğunda veya bildirildiğinde değil, yalnızca sorgu kullanıldığında değerlendirilir. Bu nedenle, sorgu değerlendirilene kadar bir değere sahip olmaz. Sorgu oluşturma ve değerlendirmenin tam açıklaması için bkz. LINQ Sorgularına Giriş (C#) veya İlk LINQ Sorgunuzu Yazma.

Bir sorgunun sonucunu görüntülemek için hata ayıklayıcının sorguyu değerlendirmesi gerekir. Hata ayıklayıcıda bir LINQ sorgu sonucunu görüntülediğinizde gerçekleşen bu örtük değerlendirmenin dikkate almanız gereken bazı etkileri vardır:

  • Sorgunun her değerlendirmesi zaman alır. Sonuç düğümünü genişletmek zaman alır. Bazı sorgularda yinelenen değerlendirmeler dikkat çekici bir performans cezasına neden olabilir.

  • Bir sorgunun değerlendirilmesi yan etkilere neden olabilir. Bu, verilerin değerinde veya programınızın durumunda yapılan değişikliklerdir. Tüm sorguların yan etkileri yoktur. Bir sorgunun yan etkileri olmadan güvenli bir şekilde değerlendirilip değerlendirilemeyeceğini belirlemek için sorguyu uygulayan kodu anlamanız gerekir.

Adımlama ve LINQ

LINQ kodunu hata ayıklarken, farkında olmanız gereken bazı adımlama davranışı farklılıkları vardır.

LINQ to SQL

LINQ to SQL sorgularında koşul kodu, hata ayıklayıcının denetiminin dışındadır. Bu nedenle, koşul koduna adım atamazsınız. bir ifade ağacına derlenen herhangi bir sorgu, hata ayıklayıcının denetiminin ötesinde bir kod üretir.

Visual Basic'te Adımlama

Visual Basic programında adım adım ilerlerken, hata ayıklayıcı bir sorgu bildirimiyle karşılaştığında, bildirimin içine adım adım girmez, ancak tüm bildirimi tek bir deyim olarak vurgular. Bu davranış, sorgu çağrılana kadar değerlendirilmediği için ortaya çıkar. Daha fazla bilgi için bkz. Visual Basic'te LINQ'e Giriş.

Aşağıdaki örnek kodda adım adım ilerlerseniz, hata ayıklayıcı sorgu bildirimini veya sorgu oluşturmayı tek bir deyim olarak vurgular.

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

Yine adım attığınızda, hata ayıklayıcı For Each cur In x'ı vurgular. Sonraki adımda MyFunctionişlevine geçer. MyFunctiongeçildikten sonra Console.WriteLine(cur.ToSting())'e geri döner. Hata ayıklayıcı bu kodu değerlendirir, ancak hiçbir noktada sorgu bildirimindeki koşul kodunda adım atmaz.

Bir Predicate'i (Mantıksal İşlev) Adımlamayı Etkinleştirmek için Bir İşlevle Değiştirme (Visual Basic)

Hata ayıklama amacıyla koşul kodunda adım adım ilerletmek zorundaysanız, koşulu özgün koşul kodunu içeren bir işlev çağrısıyla değiştirebilirsiniz. Örneğin, şu koda sahip olduğunuzu varsayalım:

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

Koşul kodunu IsEvenadlı yeni bir işleve taşıyabilirsiniz:

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

Düzeltilen sorgu, IsEvenboyunca her geçişte items işlevini çağırır. Her öğenin belirtilen koşulu karşılayıp karşılamadığını görmek için hata ayıklayıcı pencerelerini kullanabilir ve IsEvenkodunda adım adım ilerleyebilirsiniz. Bu örnekteki koşul oldukça basittir. Ancak, hata ayıklamanız gereken daha zor bir önermeye sahipseniz, bu teknik çok yararlı olabilir.

LINQ için Düzenle ve Devam Et Desteklenmiyor

Düzenle ve Devam Et sınırlamaları olan LINQ sorgularında yapılan değişiklikleri destekler. Ayrıntılar için bkz. EnC Desteklenen Değişiklikler