Frågor med en tabell (LINQ till DataSet)
LINQ-frågor (Language-Integrated Query) fungerar på datakällor som implementerar IEnumerable<T> gränssnittet eller IQueryable<T> gränssnittet. Klassen DataTable implementerar inte något av gränssnitten AsEnumerable , så du måste anropa metoden om du vill använda DataTable som källa i -satsen för From
en LINQ-fråga.
I följande exempel hämtas alla onlinebeställningar från tabellen SalesOrderHeader och order-ID, orderdatum och ordernummer skickas till konsolen.
// 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
Den lokala variabelfrågan initieras med ett frågeuttryck som fungerar på en eller flera informationskällor genom att tillämpa en eller flera frågeoperatorer från antingen standardfrågasoperatorerna eller, när det gäller LINQ till DataSet, operatorer som är specifika för DataSet klassen. Frågeuttrycket i föregående exempel använder två av standardfrågeoperatorerna: Where
och Select
.
- Where
satsen filtrerar sekvensen baserat på ett villkor, i det här fallet att OnlineOrderFlag
är inställt på true
. Operatorn Select
allokerar och returnerar ett uppräkningsbart objekt som samlar in argumenten som skickas till operatorn. I det här exemplet ovan skapas en anonym typ med tre egenskaper: SalesOrderID
, OrderDate
och SalesOrderNumber
. Värdena för dessa tre egenskaper anges till värdena för kolumnerna SalesOrderID
, OrderDate
och SalesOrderNumber
från SalesOrderHeader
tabellen.
Loopen foreach
räknar sedan upp det uppräkningsbara objektet som returneras av Select
och ger frågeresultatet. Eftersom frågan är en Enumerable typ som implementerar skjuts IEnumerable<T>utvärderingen av frågan upp tills frågevariabeln itereras över med hjälp av loopen foreach
. Med uppskjuten frågeutvärdering kan frågor behållas som värden som kan utvärderas flera gånger, varje gång som potentiellt ger olika resultat.
Metoden Field ger åtkomst till kolumnvärdena för en DataRow och SetField (visas inte i föregående exempel) anger kolumnvärden i en DataRow. Field Både metoden och SetField metoden hanterar nullbara värdetyper, så du behöver inte uttryckligen söka efter null-värden. Båda metoderna är också generiska metoder, vilket innebär att du inte behöver kasta returtypen. Du kan använda den befintliga kolumnåtkomstorn i DataRow (till exempel o["OrderDate"]
), men om du gör det måste du omvandla returobjektet till rätt typ. Om kolumnen är en nullbar värdetyp måste du kontrollera om värdet är null med hjälp IsNull av metoden . Mer information finns i Allmänna fält och SetField-metoder.
Observera att den datatyp som anges i den generiska parametern T
för Field metoden och SetField metoden måste matcha typen av det underliggande värdet, annars genereras en InvalidCastException . Det angivna kolumnnamnet måste också matcha namnet på en kolumn i DataSet eller så genereras ett ArgumentException . I båda fallen genereras undantaget vid uppräkning av körningsdata när frågan körs.