需先以 AsEnumerable() 或 AsQueryable() 轉換為 IEnumerable<DataRow>。
DataTable orders = ds.Tables["Orders"];
var query = from o in orders.AsEnumerable()
where o.Field<DateTime>("OrderDate").Year >= 1998
orderby o.Field<DateTime>("OrderDate") descending
select o;
o.Field<DateTime>("OrderDate") 編譯期檢查型別。Nullable<T>,避免 DBNull 擲出例外,免去 if (row["col"] != DBNull.Value) 判斷。foreach 迴圈中亦可替代傳統索引器。foreach (DataRow r in orderDetails.Rows)
{
if (r.Field<decimal>("UnitPrice") < 10)
r.SetField<decimal>("UnitPrice", 10);
}
繼承 TypedTableBase 已實作 IEnumerable,無需 AsEnumerable(),直接屬性存取:
var query = from o in ds.Orders
where o.OrderDate.Year >= 1998
orderby o.OrderDate descending
select new
{
o.OrderID,
o.OrderDate,
Amount = o.GetOrder_DetailsRows().Sum(od => od.UnitPrice * od.Quantity)
};
ds.Relations.Add("OrderDetails",
ds.Tables["Orders"].Columns["OrderID"],
ds.Tables["OrderDetails"].Columns["OrderID"]);
var query = from o in orders.AsEnumerable()
where o.Field<DateTime>("OrderDate").Year >= 1998
orderby o.Field<DateTime>("OrderDate") descending
select new
{
OrderID = o.Field<int>("OrderID"),
OrderDate = o.Field<DateTime>("OrderDate"),
Amount = o.GetChildRows("OrderDetails").Sum(
od => od.Field<decimal>("UnitPrice") * od.Field<short>("Quantity"))
};
LINQ to DataSet 將關係資料集無縫納入 LINQ 生態:Field/SetField 解決非類型化資料集的型別與 Null 痛點,類型化資料集則提供 POCO 風格體驗,GetChildRows 讓關聯導航如同物件圖遍歷般自然。