Single-Table Queries (LINQ to DataSet)
Language-Integrated Query (LINQ) queries work on data sources that implement the IEnumerable<T> interface or the T:System.Query.IQueryable`1 interface. The DataTable class does not implement either interface, so you must call the AsEnumerable method if you want to use the DataTable as a source in the
From clause of a LINQ query.
The following example gets all the online orders from the SalesOrderHeader table and outputs the order ID, order date, and order number to the console.
[!CODE [dplinq to dataset examples#Where1](dplinq to dataset examples#Where1)]
The local variable query is initialized with a query expression, which operates on one or more information sources by applying one or more query operators from either the standard query operators or, in the case of LINQ to DataSet, operators specific to the DataSet class. The query expression in the previous example uses two of the standard query operators:
Where clause filters the sequence based on a condition, in this case that the
OnlineOrderFlag is set to
Select operator allocates and returns an enumerable object that captures the arguments passed to the operator. In this above example, an anonymous type is created with three properties:
SalesOrderNumber. The values of these three properties are set to the values of the
SalesOrderNumber columns from the
foreach loop then enumerates the enumerable object returned by
Select and yields the query results. Because query is an Enumerable type, which implements IEnumerable<T>, the evaluation of the query is deferred until the query variable is iterated over using the
foreach loop. Deferred query evaluation allows queries to be kept as values that can be evaluated multiple times, each time yielding potentially different results.
The Field method provides access to the column values of a DataRow and the SetField (not shown in the previous example) sets column values in a DataRow. Both the Field method and SetField method handle nullable types, so you do not have to explicitly check for null values. Both methods are generic methods, also, which means you do not have to cast the return type. You could use the pre-existing column accessor in DataRow (for example,
o["OrderDate"]), but doing so would require you to cast the return object to the appropriate type. If the column is nullable you have to check if the value is null by using the IsNull method. For more information, see Generic Field and SetField Methods.
Note that the data type specified in the generic parameter
T of the Field method and SetField method must match the type of the underlying value or an InvalidCastException will be thrown. The specified column name must also match the name of a column in the DataSet or an ArgumentException will be thrown. In both cases, the exception is thrown at run time data enumeration when the query is executed.