首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to DataSet 完整指南:非類型化與類型化 DataSet 查詢、欄位存取與關聯導航

     編輯:關於.NET

非類型化 DataSet 查詢

需先以 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;

Field / SetField 三大優勢

  1. 強類型存取:o.Field<DateTime>("OrderDate") 編譯期檢查型別。
  2. Null 安全:回傳 Nullable<T>,避免 DBNull 擲出例外,免去 if (row["col"] != DBNull.Value) 判斷。
  3. 通用性:不限於 LINQ 查詢,foreach 迴圈中亦可替代傳統索引器。
foreach (DataRow r in orderDetails.Rows)
{
    if (r.Field<decimal>("UnitPrice") < 10)
        r.SetField<decimal>("UnitPrice", 10);
}

類型化 DataSet 查詢

繼承 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)
            };

導航 DataRelation (GetChildRows)

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 讓關聯導航如同物件圖遍歷般自然。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved