LINQ to DataSet Sorguları
Sorgu, veri kaynağından veri alan bir ifadedir. Sorgular genellikle ilişkisel veritabanları için SQL ve XML için XQuery gibi özel bir sorgu dilinde ifade edilir. Bu nedenle, geliştiricilerin sorguladıkları her veri kaynağı veya veri biçimi türü için yeni bir sorgu dili öğrenmeleri gerekiyordu. DilLe Tümleşik Sorgu (LINQ), çeşitli veri kaynakları ve biçimlerde verilerle çalışmak için daha basit, consis çadır modu l sunar. LINQ sorgusunda her zaman programlama nesneleriyle çalışırsınız.
LINQ sorgu işlemi üç eylemden oluşur: veri kaynağını veya kaynakları alma, sorguyu oluşturma ve sorguyu yürütme.
Genel arabirimi uygulayan IEnumerable<T> veri kaynakları LINQ aracılığıyla sorgulanabilir. üzerinde DataTable çağrısıAsEnumerable, LINQ to DataSet sorguları için veri kaynağı işlevi görecek genel IEnumerable<T> arabirimi uygulayan bir nesne döndürür.
Sorguda, veri kaynağından almak istediğiniz bilgileri tam olarak belirtirsiniz. Sorgu ayrıca bu bilgilerin döndürülmeden önce nasıl sıralanacağını, gruplandırılacağını ve şekillendirileceğini belirtebilir. LINQ'te sorgu bir değişkende depolanır. Sorgu bir değer dizisi döndürecek şekilde tasarlanmışsa, sorgu değişkeninin kendisi numaralandırılabilir bir tür olmalıdır. Bu sorgu değişkeni hiçbir işlem gerçekleştirmez ve veri döndürmez; yalnızca sorgu bilgilerini depolar. Bir sorgu oluşturduktan sonra, herhangi bir veri almak için bu sorguyu yürütmeniz gerekir.
Bir dizi değer döndüren bir sorguda, sorgu değişkeninin kendisi hiçbir zaman sorgu sonuçlarını tutmaz ve yalnızca sorgu komutlarını depolar. Sorgunun yürütülmesi, sorgu değişkeni bir foreach
veya For Each
döngüsünde yinelene kadar ertelenmiş olur. Buna ertelenmiş yürütme adı verilir; başka bir ifadeyle sorgunun yürütülmesi, sorgu oluşturulduğunda bir süre gerçekleşir. Bu, bir sorguyu istediğiniz sıklıkta yürütebileceğiniz anlamına gelir. Bu, örneğin diğer uygulamalar tarafından güncelleştirilen bir veritabanınız olduğunda kullanışlıdır. Uygulamanızda, en son bilgileri almak için bir sorgu oluşturabilir ve her seferinde güncelleştirilmiş bilgileri döndürerek sorguyu tekrar tekrar yürütebilirsiniz.
Bir dizi değer döndüren ertelenen sorguların aksine, tek değer döndüren sorgular hemen yürütülür. Tekil sorgulara Countörnek olarak , Max, Averageve verilebilir First. Bunlar hemen yürütülür çünkü tekil sonucu hesaplamak için sorgu sonuçları gereklidir. Örneğin, sorgu sonuçlarının ortalamasını bulmak için ortalama işlevinin çalışılacak giriş verilerine sahip olması için sorgunun yürütülmesi gerekir. Tek değer üretmeyen bir sorgunun ToList hemen yürütülmesini zorlamak için sorgudaki veya ToArray yöntemlerini de kullanabilirsiniz. Bir sorgunun sonuçlarını önbelleğe almak istediğinizde, anında yürütmeyi zorlamaya yönelik bu teknikler yararlı olabilir.
Sorgular
LINQ to DataSet sorguları iki farklı söz diziminde formüle edilebilir: sorgu ifadesi söz dizimi ve yöntem tabanlı sorgu söz dizimi.
Sorgu İfadesi Söz Dizimi
Sorgu ifadeleri bildirim temelli bir sorgu söz dizimidir. Bu söz dizimi, bir geliştiricinin C# veya Visual Basic'te SQL'e benzer bir biçimde sorgu yazmasına olanak tanır. Sorgu ifadesi söz dizimini kullanarak, veri kaynakları üzerinde en az kodla karmaşık filtreleme, sıralama ve gruplandırma işlemlerini bile gerçekleştirebilirsiniz. Daha fazla bilgi için bkz. LINQ Sorgu İfadeleri ve Temel Sorgu İşlemleri (Visual Basic).
.NET Framework ortak dil çalışma zamanı (CLR), sorgu ifadesi söz diziminin kendisini okuyamıyor. Bu nedenle, derleme zamanında sorgu ifadeleri CLR'nin anladığı bir şeye çevrilir: yöntem çağrıları. Bu yöntemler standart sorgu işleçleri olarak adlandırılır. Geliştirici olarak, sorgu söz dizimini kullanmak yerine yöntem söz dizimini kullanarak bunları doğrudan çağırma seçeneğiniz vardır. Daha fazla bilgi için bkz . LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi. Standart sorgu işleçleri hakkında daha fazla bilgi için bkz . Standart Sorgu İşleçlerine Genel Bakış.
Aşağıdaki örnek, tablodaki tüm satırları Product
döndürmek ve ürün adlarını görüntülemek için kullanırSelect.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> query =
from product in products.AsEnumerable()
select product;
Console.WriteLine("Product Names:");
foreach (DataRow p in query)
{
Console.WriteLine(p.Field<string>("Name"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim products As DataTable = ds.Tables("Product")
Dim query = From product In products.AsEnumerable() _
Select product
Console.WriteLine("Product Names:")
For Each p In query
Console.WriteLine(p.Field(Of String)("Name"))
Next
Yöntem Tabanlı Sorgu Söz Dizimi
LINQ to DataSet sorgularını formüle etmenin diğer yolu yöntem tabanlı sorgular kullanmaktır. Yöntem tabanlı sorgu söz dizimi, LAMBDA ifadelerini parametre olarak geçiren, LINQ işleç yöntemlerine doğrudan yöntem çağrıları dizisidir. Daha fazla bilgi için bkz . Lambda İfadeleri.
Bu örnek, öğesinin tüm satırlarını Product
döndürmek ve ürün adlarını görüntülemek için kullanırSelect.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
var query = products.AsEnumerable().
Select(product => new
{
ProductName = product.Field<string>("Name"),
ProductNumber = product.Field<string>("ProductNumber"),
Price = product.Field<decimal>("ListPrice")
});
Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
Console.WriteLine("Product name: {0} Product number: {1} List price: ${2} ",
productInfo.ProductName, productInfo.ProductNumber, productInfo.Price);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim products As DataTable = ds.Tables("Product")
Dim query = products.AsEnumerable() _
.Select(Function(product As DataRow) New With _
{ _
.ProductName = product.Field(Of String)("Name"), _
.ProductNumber = product.Field(Of String)("ProductNumber"), _
.Price = product.Field(Of Decimal)("ListPrice") _
})
Console.WriteLine("Product Info:")
For Each product In query
Console.Write("Product name: " & product.ProductName)
Console.Write("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $ " & product.Price)
Next
Sorgu Oluşturma
Bu konuda daha önce belirtildiği gibi, sorgu değişkeninin kendisi yalnızca sorgu bir değer dizisi döndürecek şekilde tasarlandığında sorgu komutlarını depolar. Sorgu anında yürütmeye neden olacak bir yöntem içermiyorsa, bir veya For Each
döngüsündeki sorgu değişkeni foreach
üzerinde yineleme yapılana kadar sorgunun gerçek yürütmesi ertelenecektir. Ertelenmiş yürütme, birden çok sorguyu birleştirmeye veya bir sorguyu uzatmaya olanak tanır. Bir sorgu genişletildiğinde, yeni işlemleri içerecek şekilde değiştirilir ve nihai yürütme değişiklikleri yansıtır. Aşağıdaki örnekte, ilk sorgu tüm ürünleri döndürür. İkinci sorgu, "L" boyutundaki tüm ürünleri döndürmek için kullanarak Where
ilk sorguyu genişletir:
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> productsQuery =
from product in products.AsEnumerable()
select product;
IEnumerable<DataRow> largeProducts =
productsQuery.Where(p => p.Field<string>("Size") == "L");
Console.WriteLine("Products of size 'L':");
foreach (DataRow product in largeProducts)
{
Console.WriteLine(product.Field<string>("Name"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim products As DataTable = ds.Tables("Product")
Dim productsQuery = From product In products.AsEnumerable() _
Select product
Dim largeProducts = _
productsQuery.Where(Function(p) p.Field(Of String)("Size") = "L")
Console.WriteLine("Products of size 'L':")
For Each product In largeProducts
Console.WriteLine(product.Field(Of String)("Name"))
Next
Sorgu yürütüldükten sonra ek sorgu oluşturulamıyor ve izleyen tüm sorgular bellek içi LINQ işleçlerini kullanır. Bir veya For Each
deyimindeki foreach
sorgu değişkeni üzerinde yineleme yaptığınızda veya anında yürütmeye neden olan LINQ dönüştürme işleçlerinden birine çağrı yapıldığında sorgu yürütme gerçekleşir. Bu işleçler şunlardır: ToList, ToArray, ToLookupve ToDictionary.
Aşağıdaki örnekte, ilk sorgu liste fiyatına göre sipariş edilen tüm ürünleri döndürür. ToArray yöntemi, sorgunun hemen yürütülmesini zorlamak için kullanılır:
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> query =
from product in products.AsEnumerable()
orderby product.Field<Decimal>("ListPrice") descending
select product;
// Force immediate execution of the query.
IEnumerable<DataRow> productsArray = query.ToArray();
Console.WriteLine("Every price from highest to lowest:");
foreach (DataRow prod in productsArray)
{
Console.WriteLine(prod.Field<Decimal>("ListPrice"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim products As DataTable = ds.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice") Descending _
Select product
' Force immediate execution of the query.
Dim productsArray = query.ToArray()
Console.WriteLine("Every price From highest to lowest:")
For Each prod In productsArray
Console.WriteLine(prod.Field(Of Decimal)("ListPrice"))
Next