Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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).
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.
veri kaynağındaki öğelerin türü,
namessorgudaki aralık değişkenininnametürüdür.seçilen nesnenin türü olan
namesorgu değişkenininmNamestürünü belirler. Buradanamebir dize olduğundan sorgu değişkeni Visual Basic'te IEnumerable(Of String) olur.mNamesiçinde tanımlanan sorgu,For Eachdö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ürkenmNamesbir dizi dize döndüreceği için döngü yineleme değişkeninmde 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.
veri kaynağındaki öğelerin türü,
customerssorgudaki aralık değişkeninincusttürüdür. Bu örnekte, bu tür şeklindedirCustomer.deyimi,
SelectnesneninNametamamı yerine herCustomernesnenin özelliğini döndürür.Namebir dize olduğundan, sorgu değişkenicustNamesyineCustomeryerine IEnumerable(Of String) olacaktır.Bir
custNamesdizi dizeyi temsil ettiğinden, döngününFor Eachyineleme değişkenicustNamebir 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.
Veri kaynağındaki öğelerin türü yine sorgudaki aralık değişkeninin türüdür. Bu örnekte,
custbir örneğidirCustomer.Selectdeyimi anonim bir tür ürettiğinden, sorgu değişkenininnameCityQueryanonim 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.Döngüdeki
For Eachyineleme 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
- Visual Basic'te LINQ kullanmaya başlama
- Anonim Tipler
- Yerel Tür Çıkarımı
- Visual Basic'da LINQ'e
Giriş - LINQ
- Arama Sorguları