İ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:
Veri kaynağını veya kaynakları alın.
Sorguyu oluşturun.
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 numbers
tü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
, Where
ve 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 evensQuery
depolanır. Sorguyu daha sonra, genellikle bir dizi değer döndüren bir For Each
döngü kullanarak veya veya Max
gibi 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, evensQuery
sorgu 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 numbers
kullanarak 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
, Average
ve First
verilebilir. 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 Integer
bir .
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.