Aracılığıyla paylaş


Sorgu İşlemlerinde Tür İlişkileri (Visual Basic)

Language-Integrated Sorgu (LINQ) sorgu işlemlerinde kullanılan değişkenler kesin olarak yazılır ve birbiriyle uyumlu olmalıdır. Veri kaynağında, sorgunun kendisinde ve sorgu yürütmesinde güçlü yazma kullanılır. Aşağıdaki çizimde, LINQ sorgusunu açıklamak için kullanılan terimler tanımlanmıştır. Sorgunun bölümleri hakkında daha fazla bilgi için bkz. Temel Sorgu İşlemleri (Visual Basic).

Öğeleri vurgulanmış bir sahte kod sorgusunu gösteren ekran görüntüsü.

Sorgudaki aralık değişkeninin türü, veri kaynağındaki öğelerin türüyle uyumlu olmalıdır. Sorgu değişkeninin türü yan tümcesinde Select tanımlanan sıra öğesiyle uyumlu olmalıdır. Son olarak, dizi öğelerinin türü de sorguyu yürüten deyiminde kullanılan döngü denetim değişkeninin For Each türüyle uyumlu olmalıdır. Bu güçlü yazma, derleme zamanında tür hatalarının tanımlanmasını kolaylaştırır.

Visual Basic, örtük tür belirleme olarak da bilinen yerel tür çıkarımını uygulayarak güçlü tür belirlemeyi kolaylaştırır. Bu özellik önceki örnekte kullanılmıştır ve LINQ örnekleri ve belgeleri boyunca kullanıldığını göreceksiniz. Visual Basic'te yerel tür çıkarımı, yalnızca Dim yan tümcesi olmadan bir As deyimi kullanarak gerçekleştirilir. Aşağıdaki örnekte, city dize olarak kesin olarak yazıldı.

Dim city = "Seattle"

Uyarı

Yerel tür çıkarımı yalnızca Option Infer olarak ayarlandığında Onçalışır. Daha fazla bilgi için bkz: Option Infer Deyimi.

Ancak, bir sorguda yerel tür çıkarımı kullansanız bile, veri kaynağındaki değişkenler, sorgu değişkeni ve sorgu yürütme döngüsü arasında aynı tür ilişkileri bulunur. LINQ sorguları yazarken veya belgelerdeki örnekler ve kod örnekleriyle çalışırken bu tür ilişkileri temel olarak anlamanız yararlı olur.

Veri kaynağından döndürülen türle eşleşmeyen bir aralık değişkeni için açık bir tür belirtmeniz gerekebilir. Bir As yan tümcesi kullanarak aralık değişkeninin türünü belirtebilirsiniz. Ancak, dönüşüm bir daraltma dönüşümü olduğunda ve Option StrictOn olarak ayarlandığında, bu bir hatayla sonuçlanır. Bu nedenle, veri kaynağından alınan değerler üzerinde dönüştürme gerçekleştirmenizi öneririz. yöntemini kullanarak veri kaynağındaki değerleri açık aralık değişkeni türüne Cast dönüştürebilirsiniz. Yan tümcesinde Select seçilen değerleri aralık değişkeninin türünden farklı bir açık türe de dönüştürebilirsiniz. Bu noktalar aşağıdaki kodda gösterilmiştir.

Dim numbers1() As Integer = {1, 2, 4, 16, 32, 64}
Dim numbers2() As Double = {5.0#, 10.0#, 15.0#}

' This code does not result in an error.
Dim numberQuery1 = From n As Integer In numbers1 Where n > 5

' This code results in an error with Option Strict set to On. The type Double
' cannot be implicitly cast as type Integer.
Dim numberQuery2 = From n As Integer In numbers2 Where n > 5

' This code casts the values in the data source to type Integer. The type of
' the range variable is Integer.
Dim numberQuery3 = From n In numbers2.Cast(Of Integer)() Where n > 5

' This code returns the value of the range variable converted to Integer. The type of
' the range variable is Double.
Dim numberQuery4 = From n In numbers2 Where n > 5 Select CInt(n)

Kaynak Verilerin Tüm Öğelerini Döndüren Sorgular

Aşağıdaki örnekte, kaynak verilerden seçilen öğe dizisini döndüren bir LINQ sorgu işlemi gösterilmektedir. kaynağı, namesbir dize dizisi içerir ve sorgu çıkışı M harfiyle başlayan dizeleri içeren bir dizidir.

Dim names = {"John", "Rick", "Maggie", "Mary"}
Dim mNames = From name In names
             Where name.IndexOf("M") = 0
             Select name

For Each nm In mNames
    Console.WriteLine(nm)
Next

Bu, aşağıdaki koda eşdeğerdir, ancak çok daha kısadır ve yazması daha kolaydır. Visual Basic'te sorgularda yerel tür çıkarımının kullanılmasına olan güven, tercih edilen stildir.

Dim names2 = {"John", "Rick", "Maggie", "Mary"}
Dim mNames2 As IEnumerable(Of String) =
    From name As String In names
    Where name.IndexOf("M") = 0
    Select name

For Each nm As String In mNames
    Console.WriteLine(nm)
Next

Türlerin örtük olarak mı yoksa açıkça mı belirlendiği, önceki kod örneklerinin her ikisinde de aşağıdaki ilişkiler vardır.

  1. veri kaynağındaki öğelerin türü, namessorgudaki aralık değişkeninin nametürüdür.

  2. seçilen nesnenin türü olan namesorgu değişkeninin mNamestürünü belirler. Burada name bir dize olduğundan sorgu değişkeni Visual Basic'te IEnumerable(Of String) olur.

  3. mNames içinde tanımlanan sorgu, For Each döngüsünde yürütülür. Döngü, sorgunun çalıştırılması sonucunda elde edilen veri üzerinde yinelenir. yürütülürken mNamesbir dizi dize döndüreceği için döngü yineleme değişkeni nmde bir dizedir.

Seçili Öğelerden Bir Alan Döndüren Sorgular

Aşağıdaki örnekte, veri kaynağından seçilen her öğenin yalnızca bir bölümünü içeren bir sıra döndüren LINQ to SQL sorgu işlemi gösterilmektedir. Sorgu, veri kaynağı olarak bir Customer nesne koleksiyonu kullanır ve sonuçta yalnızca Name özelliğini yansıtır. Müşteri adı bir dize olduğundan, sorgu çıkış olarak bir dizi dize oluşturur.

' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim custNames = From cust In customers
                Where cust.City = "London"
                Select cust.Name

For Each custName In custNames
    Console.WriteLine(custName)
Next

Değişkenler arasındaki ilişkiler, daha basit örnektekilere benzer.

  1. veri kaynağındaki öğelerin türü, customerssorgudaki aralık değişkeninin custtürüdür. Bu örnekte, bu tür şeklindedir Customer.

  2. deyimi, Select nesnenin Name tamamı yerine her Customer nesnenin özelliğini döndürür. Name bir dize olduğundan, sorgu değişkeni custNames yine Customer yerine IEnumerable(Of String) olacaktır.

  3. Bir custNames dizi dizeyi temsil ettiğinden, döngünün For Each yineleme değişkeni custNamebir dize olmalıdır.

Yerel tür çıkarımı olmadan, önceki örnek, aşağıdaki örnekte gösterildiği gibi yazmak ve anlamak için daha hantal olurdu.

' Method GetTable returns a table of Customer objects.
 Dim customers As Table(Of Customer) = db.GetTable(Of Customer)()
 Dim custNames As IEnumerable(Of String) =
     From cust As Customer In customers
     Where cust.City = "London"
     Select cust.Name

 For Each custName As String In custNames
     Console.WriteLine(custName)
 Next

Anonim türler gerektiren sorgular

Aşağıdaki örnekte daha karmaşık bir durum gösterilmektedir. Önceki örnekte, tüm değişkenler için türleri açıkça belirtmek uygun değildi. Bu örnekte imkansızdır. Veri kaynağından öğelerin tamamını Customer veya her öğeden tek bir alan seçmek yerine, bu sorgudaki Select yan tümce özgün Customer nesnenin iki özelliğini döndürür: Name ve City. yan tümcesine Select yanıt olarak, derleyici bu iki özelliği içeren anonim bir tür tanımlar. nameCityQuery'ın For Each döngüsünde yürütülmesinin sonucu, anonim yeni türün örneklerinden oluşan bir koleksiyondur. Anonim türün kullanılabilir bir adı olmadığı için nameCityQuery veya custInfo türünü açıkça belirtemezsiniz. Başka bir ifadeyle, anonim bir türle, String yerinde kullanılacak bir tür adınız IEnumerable(Of String) yoktur. Daha fazla bilgi için bkz. Anonim Türler.

' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim nameCityQuery = From cust In customers
                    Where cust.City = "London"
                    Select cust.Name, cust.City

For Each custInfo In nameCityQuery
    Console.WriteLine(custInfo.Name)
Next

Önceki örnekteki tüm değişkenler için türleri belirtmek mümkün olmasa da, ilişkiler aynı kalır.

  1. Veri kaynağındaki öğelerin türü yine sorgudaki aralık değişkeninin türüdür. Bu örnekte, cust bir örneğidir Customer.

  2. Select deyimi anonim bir tür ürettiğinden, sorgu değişkeninin nameCityQueryanonim bir tür olarak örtük olarak yazılması gerekir. Anonim bir türün kullanılabilir adı yoktur ve bu nedenle açıkça belirtilemez.

  3. Döngüdeki For Each yineleme değişkeninin türü, 2. adımda oluşturulan anonim türdür. Türün kullanılabilir adı olmadığından, döngü yineleme değişkeninin türü örtük olarak belirlenmelidir.

Ayrıca bakınız