İlk LINQ Sorgunuzu Yazma (Visual Basic)

Sorgu, veri kaynağından veri alan bir ifadedir. Sorgular ayrılmış sorgu dilinde ifade edilir. Zaman içinde, ilişkisel veritabanları için SQL ve XML için XQuery gibi farklı veri kaynağı türleri için farklı diller geliştirilmiştir. Bu, uygulama geliştiricisinin desteklenen her veri kaynağı veya veri biçimi türü için yeni bir sorgu dili öğrenmesini zorunlu kılar.

DilLe Tümleşik Sorgu (LINQ), çeşitli veri kaynakları ve biçimlerde verilerle çalışmak için bir consis çadır modu l sunarak durumu basitleştirir. LINQ sorgusunda her zaman nesnelerle çalışırsınız. XML belgeleri, SQL veritabanları, ADO.NET veri kümeleri ve varlıkları, .NET Framework koleksiyonları ve LINQ sağlayıcısının kullanılabildiği diğer kaynak veya biçimlerdeki verileri sorgulamak ve dönüştürmek için aynı temel kodlama desenlerini kullanırsınız. Bu belgede, temel LINQ sorgularının oluşturulması ve kullanılmasına ilişkin üç aşama açıklanmaktadır.

Bir Sorgu İşleminin Üç Aşaması

LINQ sorgu işlemleri üç eylemden oluşur:

  1. Veri kaynağını veya kaynakları alın.

  2. Sorguyu oluşturun.

  3. Sorguyu çalıştırın.

LINQ'de sorgunun yürütülmesi, sorgunun oluşturulmasından farklıdır. Yalnızca sorgu oluşturarak herhangi bir veri alamazsınız. Bu nokta, bu konunun ilerleyen bölümlerinde daha ayrıntılı olarak ele alınmıştır.

Aşağıdaki örnekte sorgu işleminin üç bölümü gösterilmektedir. Örnek, gösterim amacıyla kullanışlı bir veri kaynağı olarak bir tamsayı dizisi kullanır. Ancak, aynı kavramlar diğer veri kaynakları için de geçerlidir.

Not

Derleme Sayfası, Project Tasarım Aracı (Visual Basic)'nde Option çıkar seçeneğinin Açık olarak ayarlandığından emin olun.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Çıkış:

0 2 4 6

Veri Kaynağı

Önceki örnekteki veri kaynağı bir dizi olduğundan, genel IEnumerable<T> arabirimi örtük olarak destekler. LinQ sorgusu için bir diziyi veri kaynağı olarak kullanmanızı sağlayan gerçek budur. Destekleyen IEnumerable<T> türler veya genel IQueryable<T> gibi türetilmiş arabirimler sorgulanabilir türler olarak adlandırılır.

Örtük olarak sorgulanabilir bir tür olarak dizi, LINQ veri kaynağı olarak görev yapmak için herhangi bir değişiklik veya özel işlem gerektirmez. Aynı durum, genel List<T>, Dictionary<TKey,TValue>ve .NET Framework sınıf kitaplığındaki diğer sınıflar da dahil olmak üzere destekleyen tüm koleksiyon türleri IEnumerable<T>için geçerlidir.

Kaynak veriler henüz uygulamadıysaIEnumerable<T>, söz konusu veri kaynağı için standart sorgu işleçlerinin işlevselliğini uygulamak için bir LINQ sağlayıcısı gerekir. Örneğin, LINQ to XML, aşağıdaki örnekte gösterildiği gibi bir XML belgesini sorgulanabilir XElement bir türe yükleme işini işler. Standart sorgu işleçleri hakkında daha fazla bilgi için bkz . Standart Sorgu İşleçlerine Genel Bakış (Visual Basic).

' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")

LINQ to SQL ile, önce tasarım zamanında el ile veya Visual Studio'da Visual Studio'da LINQ to SQL Araçları'nı kullanarak nesne ilişkisel eşleme oluşturursunuz. Sorgularınızı nesnelere yazarsınız ve çalışma zamanında LINQ to SQL veritabanıyla iletişimi işler. Aşağıdaki örnekte, customers veritabanındaki belirli bir tabloyu temsil eder ve Table<TEntity> genel IQueryable<T>'i destekler.

' Create a data source from a SQL table.
Dim db As New DataContext("C:\Northwind\Northwnd.mdf")
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)

Belirli veri kaynağı türlerini oluşturma hakkında daha fazla bilgi için çeşitli LINQ sağlayıcılarının belgelerine bakın. (Bu sağlayıcıların listesi için bkz. LINQ (DilLe Tümleşik Sorgu).) Temel kural basittir: LINQ veri kaynağı, genel IEnumerable<T> arabirimi destekleyen herhangi bir nesne veya ondan devralan bir arabirimdir.

Not

Genel olmayan IEnumerable arabirimi destekleyen türler ArrayList LINQ veri kaynakları olarak da kullanılabilir. kullanan ArrayListbir örnek için bkz . How to: Query an ArrayList with LINQ (Visual Basic).

Sorgu

Sorguda, veri kaynağından veya kaynaklardan hangi bilgileri almak istediğinizi belirtirsiniz. Ayrıca bu bilgilerin döndürülmeden önce nasıl sıralanacağını, gruplandırılacağını veya yapılandırılacağını belirtme seçeneğiniz de vardır. Visual Basic, sorgu oluşturmayı etkinleştirmek için dile yeni sorgu söz dizimi eklemiştir.

Yürütüldüğünde, aşağıdaki örnekteki sorgu bir tamsayı dizisindeki numberstüm çift sayıları döndürür.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Sorgu ifadesi üç yan tümce içerir: From, Whereve Select. Her sorgu ifadesi yan tümcesinin belirli işlevi ve amacı, Temel Sorgu İşlemleri (Visual Basic) bölümünde açıklandı. Daha fazla bilgi için bkz . Sorgular. LINQ'te sorgu tanımının genellikle bir değişkende depolandığını ve daha sonra yürütüldüğünü unutmayın. Önceki örnekte olduğu gibi evensQuery sorgu değişkeni sorgulanabilir bir tür olmalıdır. türü evensQuery , IEnumerable(Of Integer)yerel tür çıkarımı kullanılarak derleyici tarafından atanır.

Sorgu değişkeninin kendisi hiçbir işlem gerçekleştirmez ve veri döndürmez. Yalnızca sorgu tanımını depolar. Önceki örnekte sorguyu For Each yürüten döngüdür.

Sorgu Yürütme

Sorgu yürütme, sorgu oluşturma işleminden ayrıdır. Sorgu oluşturma sorguyu tanımlar, ancak yürütme farklı bir mekanizma tarafından tetikler. Sorgu tanımlandığı anda yürütülebilir (anında yürütme) veya tanım depolanabilir ve sorgu daha sonra yürütülebilir (ertelenmiş yürütme).

Ertelenmiş Yürütme

Tipik bir LINQ sorgusu, evensQuery önceki örnekte tanımlanan sorguya benzer. Sorguyu oluşturur ancak hemen yürütmez. Bunun yerine, sorgu tanımı sorgu değişkeninde evensQuerydepolanır. Sorguyu daha sonra, genellikle bir dizi değer döndüren bir For Each döngü kullanarak veya veya Maxgibi Count standart bir sorgu işleci uygulayarak yürütebilirsiniz. Bu işlem ertelenmiş yürütme olarak adlandırılır.

' Query execution that results in a sequence of values.
For Each number In evensQuery
    Console.Write(number & " ")
Next

' Query execution that results in a single value.
Dim evens = evensQuery.Count()

Bir değer dizisi için, döngüdeki For Each yineleme değişkenini (number önceki örnekte) kullanarak alınan verilere erişirsiniz. sorgu değişkeni, evensQuerysorgu sonuçları yerine sorgu tanımını barındırdığından, sorgu değişkenini birden çok kez kullanarak sorguyu istediğiniz sıklıkta yürütebilirsiniz. Örneğin, uygulamanızda ayrı bir uygulama tarafından sürekli güncelleştirilen bir veritabanınız olabilir. Bu veritabanından veri alan bir sorgu oluşturduktan sonra, her seferinde en son verileri alarak sorguyu tekrar tekrar yürütmek için bir For Each döngü kullanabilirsiniz.

Aşağıdaki örnekte ertelenen yürütmenin nasıl çalıştığı gösterilmektedir. Önceki örneklerde olduğu gibi bir döngüyle For Each tanımlanıp yürütüldükten sonra evensQuery2 veri kaynağındaki numbers bazı öğeler değiştirilir. Ardından ikinci For Each bir döngü yeniden çalıştırılır evensQuery2 . döngü içindeki yeni değerleri numberskullanarak sorguyu yeniden yürüttüğünden For Each sonuçlar ikinci kez farklıdır.

Dim numberArray() = {0, 1, 2, 3, 4, 5, 6}

Dim evensQuery2 = From num In numberArray
                  Where num Mod 2 = 0
                  Select num

Console.WriteLine("Evens in original array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

' Change a few array elements.
numberArray(1) = 10
numberArray(4) = 22
numberArray(6) = 8

' Run the same query again.
Console.WriteLine(vbCrLf & "Evens in changed array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

Çıkış:

Evens in original array:

0 2 4 6

Evens in changed array:

0 10 2 22 8

Hemen Yürütme

Sorguların ertelenmiş yürütülmesinde, sorgu tanımı daha sonra yürütüleceği bir sorgu değişkeninde depolanır. Anında yürütmede, sorgu tanımı sırasında yürütülür. Sorgu sonucunun tek tek öğelerine erişim gerektiren bir yöntem uyguladığınızda yürütme tetikleniyor. Anında yürütme genellikle tek değer döndüren standart sorgu işleçlerinden biri kullanılarak zorlanır. Örnek olarak Count, Max, Averageve Firstverilebilir. Bu standart sorgu işleçleri, tek bir sonucu hesaplamak ve döndürmek için sorguyu uygulanır uygulanmaz yürütür. Tek değerler döndüren standart sorgu işleçleri hakkında daha fazla bilgi için bkz . Toplama İşlemleri, Öğe İşlemleri ve Niceleyici İşlemleri.

Aşağıdaki sorgu, bir tamsayı dizisindeki çift sayıların sayısını döndürür. Sorgu tanımı kaydedilmez ve numEvens basit Integerbir .

Dim numEvens = (From num In numbers
                Where num Mod 2 = 0
                Select num).Count()

yöntemini kullanarak Aggregate aynı sonucu elde edebilirsiniz.

Dim numEvensAgg = Aggregate num In numbers
                  Where num Mod 2 = 0
                  Select num
                  Into Count()

Ayrıca, aşağıdaki kodda gösterildiği gibi sorgu üzerinde veya ToArray yöntemini çağırarak ToList (anında) veya sorgu değişkeninin (ertelenmiş) yürütülmesini zorlayabilirsiniz.

' Immediate execution.
Dim evensList = (From num In numbers
                 Where num Mod 2 = 0
                 Select num).ToList()

' Deferred execution.
Dim evensQuery3 = From num In numbers
                  Where num Mod 2 = 0
                  Select num
' . . .
Dim evensArray = evensQuery3.ToArray()

Önceki örneklerde evensQuery3 bir sorgu değişkenidir, ancak evensList bir listedir ve evensArray bir dizidir.

ToArray Sorguyu ToList hemen yürütmek ve sonuçları tek bir koleksiyon nesnesinde önbelleğe almak istediğiniz senaryolarda veya kullanarak anında yürütmeyi zorlamak özellikle yararlıdır. Bu yöntemler hakkında daha fazla bilgi için bkz . Veri Türlerini Dönüştürme.

Ayrıca yöntemi gibi bir yöntem kullanarak sorgunun IEnumerable yürütülmesine IEnumerable.GetEnumerator neden olabilirsiniz.

Ayrıca bkz.