Single-Table 查詢 (LINQ to DataSet)
Language-Integrated 查詢 (LINQ) 查詢適用於實作 IEnumerable<T> 介面或 IQueryable<T> 介面的數據源。
DataTable 類別不會實作任一介面,因此如果您想要在LINQ查詢的 From
子句中使用 DataTable 做為來源,則必須呼叫 AsEnumerable 方法。
下列範例會從 SalesOrderHeader 數據表取得所有在線訂單,並將訂單標識碼、訂單日期和訂單號碼輸出至控制台。
// 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: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {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
局部變數 query 會使用查詢表達式初始化,此表達式會透過套用一或多個查詢運算子,作用於一或多個信息來源,這些運算子可以是標準查詢運算子,也可以是在 LINQ to DataSet 的情況下,針對 DataSet 類別的特定運算子。 上一個範例中的查詢表示式使用兩個標準查詢運算符:Where
和 Select
。
Where
子句會根據條件篩選序列,在此情況下,OnlineOrderFlag
會設定為 true
。
Select
運算符會配置並傳回可列舉的物件,以捕捉傳遞至運算符的參數。 在上述範例中,會使用三個屬性來建立匿名類型:SalesOrderID
、OrderDate
和 SalesOrderNumber
。 這三個屬性的值會設定為 SalesOrderHeader
資料表中 SalesOrderID
、OrderDate
和 SalesOrderNumber
數據行的值。
foreach
循環接著會列舉 Select
所傳回的可列舉物件,併產生查詢結果。 因為查詢是實作 IEnumerable<T>的 Enumerable 型別,所以查詢的評估會延後,直到使用 foreach
迴圈來遍歷查詢變數為止。 延遲查詢評估可讓查詢保留為可多次評估的值,每次產生可能不同的結果。
Field 方法可讓您存取 DataRow 的數據行值,而 SetField(上例中未顯示)會設定 DataRow中的數據行值。
Field 方法和 SetField 方法都處理可為 Null 的實值類型,因此您不需要明確檢查 Null 值。 這兩種方法都是泛型方法,這也表示您不需要對回傳類型進行型別轉換。 您可以在 DataRow 中使用預先存在的數據行存取子(例如,o["OrderDate"]
),但這樣做會要求您將傳回物件轉換成適當的類型。 如果數據行是可為 Null 的實值類型,您必須使用 IsNull 方法來檢查值是否為 null。 如需詳細資訊,請參閱 泛型 Field 和 SetField 方法。
請注意,在泛型參數中指定的數據類型 T
Field 方法和 SetField 方法必須符合基礎值的型別,否則將會擲回 InvalidCastException。 指定的數據行名稱也必須符合 DataSet 中的數據行名稱,否則將會擲回 ArgumentException。 在這兩種情況下,當執行查詢時,會在運行時的數據枚舉中拋出例外。