Query's met één tabel (LINQ naar DataSet)
LinQ-query's (Language-Integrated Query) werken aan gegevensbronnen die de IEnumerable<T> interface of de IQueryable<T> interface implementeren. De DataTable klasse implementeert geen van beide interfaces, dus u moet de AsEnumerable methode aanroepen als u de DataTable als bron in de From
component van een LINQ-query wilt gebruiken.
In het volgende voorbeeld worden alle onlineorders opgehaald uit de tabel SalesOrderHeader en wordt de order-id, orderdatum en ordernummer naar de console uitgevoerd.
// 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
De lokale variabelequery wordt geïnitialiseerd met een query-expressie, die op een of meer informatiebronnen werkt door een of meer queryoperators toe te passen van de standaardqueryoperators of, in het geval van LINQ op DataSet, operators die specifiek zijn voor de DataSet klasse. De query-expressie in het vorige voorbeeld maakt gebruik van twee van de standaardqueryoperators: Where
en Select
.
De Where
component filtert de reeks op basis van een voorwaarde, in dit geval dat de OnlineOrderFlag
waarde is ingesteld op true
. De Select
operator wijst een enumereerbaar object toe en retourneert dat de argumenten vastlegt die aan de operator zijn doorgegeven. In dit bovenstaande voorbeeld wordt een anoniem type gemaakt met drie eigenschappen: SalesOrderID
, OrderDate
en SalesOrderNumber
. De waarden van deze drie eigenschappen worden ingesteld op de waarden van de SalesOrderID
, OrderDate
en SalesOrderNumber
kolommen uit de SalesOrderHeader
tabel.
De foreach
lus inventariseert vervolgens het enumerable object dat wordt geretourneerd door Select
en levert de queryresultaten op. Omdat de query een Enumerable type is dat wordt geïmplementeerd IEnumerable<T>, wordt de evaluatie van de query uitgesteld totdat de queryvariabele wordt herhaald met behulp van de lus foreach
. Met de evaluatie van uitgestelde query's kunnen query's worden bewaard als waarden die meerdere keren kunnen worden geëvalueerd, telkens wanneer ze mogelijk verschillende resultaten opleveren.
De Field methode biedt toegang tot de kolomwaarden van een DataRow en de SetField kolomwaarden (niet weergegeven in het vorige voorbeeld) stelt kolomwaarden in een DataRow. Zowel de methode als SetField de Field methode verwerken null-waardetypen, dus u hoeft niet expliciet te controleren op null-waarden. Beide methoden zijn algemene methoden, wat betekent dat u het retourtype niet hoeft te casten. U kunt de bestaande kolomtoegangsfunctie gebruiken in DataRow (bijvoorbeeld o["OrderDate"]
), maar hiervoor moet u het retourobject naar het juiste type casten. Als de kolom een type null-waarde is, moet u controleren of de waarde null is met behulp van de IsNull methode. Zie Algemene veld- en SetField-methoden voor meer informatie.
Het gegevenstype dat is opgegeven in de algemene parameter T
van de Field methode en SetField methode, moet overeenkomen met het type van de onderliggende waarde of een InvalidCastException wordt gegenereerd. De opgegeven kolomnaam moet ook overeenkomen met de naam van een kolom in de DataSet kolom of er wordt een ArgumentException gegenereerd. In beide gevallen wordt de uitzondering gegenereerd tijdens de inventarisatie van runtimegegevens wanneer de query wordt uitgevoerd.