Aracılığıyla paylaş


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

Kullanılan değişkenler Dil ile Tümleşik Sorgu (LINQ) sorgu işlemleri kesinlikle yazılan ve birbiriyle uyumlu olması gerekir.Güçlü yazarak veri kaynağına sorgu ve sorgu yürütme kullanılır.Aşağıdaki resimde açıklamak için kullanılan terimler tanımlayan bir LINQ sorgu.Bir sorgunun bölümleri hakkında daha fazla bilgi için bkz: Temel Sorgu İşlemleri (Visual Basic).

LINQ sorgu bölümleri

Öğeleri vurgulanmış sahte kod sorgu.

Sorgu aralığı değişkenin türü veri kaynağındaki öğe türü ile uyumlu olmalıdır.Sorgu değişken türü tanımlı sıra öğesi ile uyumlu Select yan tümcesi.Son olarak, sıra öğeleri de kullanılan döngü denetim değişkeni türü ile uyumlu türünde olmalıdır For Each yürütür sorgu deyimi.Bu güçlü yazarak, derleme zamanında tür hatalarının tanımlanması kolaylaştırır.

Visual Basicgüçlü yazarak olarak da bilinen yerel tür kesmesi uygulayarak kullanışlı yapar örtülü yazmaya.Özellik önceki örnekte kullanılan ve genelinde kullanılan görürsünüz LINQ örnekler ve belgeler.Visual Basic'te, yerel tür kesmesi yeterlidir kullanılarak gerçekleştirilen bir Dim deyimi olmadan bir As yan tümcesi.Aşağıdaki örnekte, city bir dize olarak kesinlikle yazılı.

Dim city = "Seattle"

[!NOT]

Yerel tür kesmesi çalışır sadece Option Infer ayarlamak On.Daha fazla bilgi için bkz. Option Infer Deyimi.

Bir sorgu yerel tür kesmesi kullansanız bile, ancak aynı tür ilişkileri değişkenleri veri kaynağındaki sorgu değişkeni ve sorgu yürütme döngü arasında yok.Yazarken bu tür ilişkileri hakkında temel bilgi sahibi olması yararlı olacaktır LINQ sorgular ya da çalışma örnekleri ve belgelerinde kod örnekleri.

Veri kaynağından dönen türüyle eşleşmeyen bir aralık değişkeni için açık türe belirtmeniz gerekebilir.Aralık değişken türünü kullanarak belirtmek bir As yan tümcesi.Dönüştürme, ancak bu hatayla sonuçlanır bir dönüştürme daraltmaya ve Option Strict ayarlamak On.Bu nedenle, veri kaynağından alınan değerler Dönüşüm gerçekleştirmenizi öneririz.Kullanarak açık aralık değişken türü veri kaynağından değerleri dönüştürebilirsiniz Cast``1 yöntemi.Seçilen değerleri de çevirebilirsiniz Select aralığı değişken türünden farklı bir açık türüne yan tümcesi.Bu noktalar aşağıdaki kodda gösterildiği gibidir.

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 öğeleri döndüren sorgular

Aşağıdaki örnekte gösterildiği bir LINQ veri kaynağından seçilen öğelerin sırasını döndürür işlemi sorgula.Kaynak names, dizeleri, bir dizi içerir ve sorgu çıktısı m harfiyle başlayan dizeleri içeren bir sıra.

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 kodu eşdeğeri olan, ancak daha kısa ve daha kolay yazmak.Yerel tür kesmesi sorgularda bağımlılığı, Visual Basic tercih edilen stilidir.

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ürler örtük veya açık olarak belirlenir olup olmadığını aşağıdaki ilişkileri hem önceki kod örnekleri mevcut.

  1. Veri kaynağında öğe türü names, aralık değişken türü name, sorgu.

  2. Seçiliyse, nesne türü name, sorgu değişken türünü belirler mNames.Burada name sorgu değişken (dize), IEnumerable Visual Basic'te, bu nedenle bir karakter dizisidir.

  3. Tanımlanan sorgu mNames içinde yürütülen For Each döngü.Sorgu yürütme sonuç üzerinde döngüyü yineler.Çünkü mNames, yürütüldüğünde, dizeler, döngü tekrarında değişkeni bir dizi döndürür nm, ayrıca bir dizedir.

Seçili öğelerden bir alan döndüren sorgular

Aşağıdaki örnekte gösterildiği bir LINQ - SQL sorgu işlemi, veri kaynağından seçilen her öğenin yalnızca bir bölümünü içeren bir dizi döndürür.Sorgu topluluğu alır Customer nesneleri, veri kaynağı olarak ve yalnızca projeleri Name özelliği sonuç.Müşteri adı, bir dize olduğundan, sorgu dizeleri dizisi çıktı olarak üretir.

' 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

Bu basit örnekte değişkenler arasındaki ilişkileri gibidir.

  1. Veri kaynağında öğe türü customers, aralık değişken türü cust, sorgu.Türü bu örnekte, Customer.

  2. Select Deyiminin döndüreceği Name özelliği her Customer tüm nesne yerine nesne.Çünkü Name sorgu değişkeni, dize custNames, yeniden (dize), IEnumerable, olmaz Customer.

  3. Çünkü custNames dizeleri, bir dizi temsil For Each döngünün yineleme değişkeni custName, bir dize olmalıdır.

Yerel tür kesmesi önceki örnek yazmak için ve aşağıdaki örnekte gösterildiği gibi anlamanın 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ürleri gerektiren sorgular

Aşağıdaki örnek, daha karmaşık bir durum gösterir.Önceki örnekte, tüm değişken türleri açıkça belirtmek uyandırmayacağından.Bu örnekte, mümkün değildir.Tamamını seçmek yerine Customer veri kaynağı veya her öğeyi tek bir alandan öğeler Select bu sorgu yan tümcesinde iki özellikleri özgün verir Customer nesne: Name ve City.Yanıt olarak Select yan tümcesi, derleyici bu iki özellik içeren bir anonim tür tanımlar.Yürütme sonucunu nameCityQuery , For Each döngü yeni anonim tür örneklerini topluluğudur.Anonim tür kullanılabilir adı yok çünkü türü belirtilemez nameCityQuery veya custInfo açıkça.Diğer bir deyişle, anonim bir türle hiçbir tür adı yerine kullanmak için elinizde String , IEnumerable(Of String).Daha fazla bilgi için bkz. Anonim Türleri (Visual Basic).

' 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 örnekte, tüm değişken türleri belirlemek mümkün olmasa da, ilişkileri aynı kalır.

  1. Veri kaynağında öğe türünü yeniden sorgu aralığı değişkeninde türüdür.Bu örnekte, cust örneğidir Customer.

  2. Çünkü Select deyimi üreten bir anonim tür sorgu değişkenine nameCityQuery, dolaylı olarak bir anonim tür yazılmalıdır.Anonim bir tür kullanılabilir bir ada sahip değil ve bu nedenle açıkça belirtilemez.

  3. Yineleme değişkeni türü For Each 2. adımda oluşturduğunuz anonim tür döngü olduğunu.Kullanılabilir ad türü olduğu için döngü değişkeni türü örtülü olarak belirlenmesi gerekir.

Ayrıca bkz.

Kavramlar

Anonim Türleri (Visual Basic)

Yerel Türü Arabirimi (Visual Basic Başvurusu)

Visual Basic'de LINQ'e Giriş

Diğer Kaynaklar

Visual Basic'te LINQ'e Başlarken

Visual Basic'de LINQ

Sorgular (Visual Basic)