Tek Tablolu Sorgular (LINQ to DataSet)
Dil Tümleşik Sorgu (LINQ) sorguları, arabirimi veya IQueryable<T> arabirimi uygulayan IEnumerable<T> veri kaynakları üzerinde çalışır. DataTable sınıfı herhangi bir arabirim uygulamaz, bu nedenle linq sorgusunun yan tümcesinde From
kaynak olarak kullanmak DataTable istiyorsanız yöntemini çağırmanız AsEnumerable gerekir.
Aşağıdaki örnek SalesOrderHeader tablosundaki tüm çevrimiçi siparişleri alır ve sipariş kimliğini, sipariş tarihini ve sipariş numarasını konsola verir.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
var query =
from order in orders.AsEnumerable()
where order.Field<bool>("OnlineOrderFlag") == true
select new
{
SalesOrderID = order.Field<int>("SalesOrderID"),
OrderDate = order.Field<DateTime>("OrderDate"),
SalesOrderNumber = order.Field<string>("SalesOrderNumber")
};
foreach (var onlineOrder in query)
{
Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",
onlineOrder.SalesOrderID,
onlineOrder.OrderDate,
onlineOrder.SalesOrderNumber);
}
' 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 orders As DataTable = ds.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Select New With { _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
}
For Each onlineOrder In query
Console.Write("Order ID: " & onlineOrder.SalesOrderID)
Console.Write(" Order date: " & onlineOrder.OrderDate)
Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next
Yerel değişken sorgusu, standart sorgu işleçlerinden veya LINQ to DataSet söz konusu olduğunda sınıfa DataSet özgü işleçlerden bir veya daha fazla sorgu işleci uygulayarak bir veya daha fazla bilgi kaynağı üzerinde çalışan bir sorgu ifadesiyle başlatılır. Önceki örnekteki sorgu ifadesi standart sorgu işleçlerinden ikisini kullanır: Where
ve Select
.
Where
yan tümcesi, bir koşula göre diziyi OnlineOrderFlag
filtreler, bu durumda olarak ayarlanırtrue
. Select
işleci, işlecine geçirilen bağımsız değişkenleri yakalayan numaralandırılabilir bir nesne ayırır ve döndürür. Yukarıdaki örnekte, üç özelliğe sahip anonim bir tür oluşturulur: SalesOrderID
, OrderDate
ve SalesOrderNumber
. Bu üç özelliğin değerleri, tablodaki SalesOrderID
, OrderDate
ve SalesOrderNumber
sütunlarının değerlerine SalesOrderHeader
ayarlanır.
Döngü foreach
daha sonra tarafından Select
döndürülen numaralandırılabilir nesneyi numaralandırır ve sorgu sonuçlarını verir. Sorgu uygulayan IEnumerable<T>bir Enumerable tür olduğundan, sorgu değişkeni döngü kullanılarak yinelenene kadar sorgunun değerlendirmesi ertelenmiş foreach
olur. Ertelenen sorgu değerlendirmesi, sorguların her seferinde farklı sonuçlara neden olan birden çok kez değerlendirilebilecek değerler olarak tutulmasını sağlar.
yöntemi, Field bir DataRow sütun değerlerine erişim sağlar ve SetField (önceki örnekte gösterilmez) içindeki DataRowsütun değerlerini ayarlar. Field Hem yöntem hem SetField de yöntem null değer türlerini işler, bu nedenle null değerleri açıkça denetlemeniz gerekmez. Her iki yöntem de genel yöntemlerdir ve bu da dönüş türünü atamanız gerekmediği anlamına gelir. içinde önceden var olan sütun erişimcisini DataRow (örneğin, o["OrderDate"]
) kullanabilirsiniz, ancak bunu yapmak için dönüş nesnesini uygun türe dönüştürmeniz gerekir. Sütun null atanabilir bir değer türüyse, yöntemini kullanarak IsNull değerin null olup olmadığını denetlemeniz gerekir. Daha fazla bilgi için bkz . Genel Alan ve SetField Yöntemleri.
Yöntemin ve SetField yöntemin genel parametresinde T
Field belirtilen veri türünün temel alınan değerin türüyle eşleşmesi gerektiğini veya bir InvalidCastException oluşturulacağını unutmayın. Belirtilen sütun adı, içindeki bir sütunun adıyla DataSet da eşleşmelidir; aksi ArgumentException takdirde bir oluşturulur. Her iki durumda da, sorgu yürütülürken çalışma zamanı veri numaralandırmasında özel durum oluşturulur.