Share via


單一資料表查詢 (LINQ to DataSet)

更新: November 2007

Language-Integrated Query (LINQ) 查詢會在實作 IEnumerable<T> 介面或 IQueryable 介面的資料來源上運作。由於 DataTable 類別 (Class) 不會實作任何一種介面,因此如果您想要在 LINQ 查詢的 From 子句中使用 DataTable 當做 來源,就必須呼叫 AsEnumerable 方法。

下列範例會從 SalesOrderHeader 資料表中取得所有線上訂單,並將訂單識別碼、訂單日期和訂單號碼輸出至主控台。

' 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
// 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);
}

區域變數查詢是以查詢運算式初始化,而此運算式會透過套用標準查詢運算子或 (在 LINQ to DataSet 的情況中) DataSet 類別專用之運算子中的一個或多個查詢運算子,在一個或多個資訊來源上運作。上一個範例中的查詢運算式會使用其中兩個標準查詢運算子:Where 和 Select。

在 OnlineOrderFlag 設定為 true 的情況中,Where 子句會根據條件來篩選序列 (Sequence)。Select 運算子會配置並傳回擷取傳遞給運算子之引數的可列舉物件。在上述範例中,匿名型別是使用三個屬性建立的:SalesOrderID、OrderDate 及 SalesOrderNumber。這三個屬性的值分別設定為 SalesOrderHeader 資料表中 SalesOrderID、OrderDate 和 SalesOrderNumber 資料行的值。

然後,foreach 迴圈 (Loop) 會列舉 Select 所傳回的可列舉物件並產生查詢結果。由於查詢是實作 IEnumerable<T>Enumerable 型別,因此查詢的評估會延後,直到使用 foreach 迴圈來反覆查看查詢變數為止。延後的查詢評估允許將查詢保留成可多次評估的值,而且每次可能會產生不同的結果。

Field 方法可讓您存取 DataRow 的資料行值而 SetField (上一個範例中未顯示) 會設定 DataRow 中的資料行值。由於 Field 方法和 SetField 方法都會處理可為 Null 的型別 (Nullable Type),因此您不需要明確檢查是否有 Null 值。此外,這兩種方法都是泛型方法,表示您不需要轉型傳回型別。雖然您可以使用 DataRow 中的現有資料行存取子 (例如 o["OrderDate"]),但是這樣做就必須將傳回物件轉型為適當的型別。如果資料行可為 Null,您就必須使用 IsNull 方法來檢查其值是否為 Null。如需詳細資訊,請參閱 泛型 Field 和 SetField 方法 (LINQ to DataSet)

請注意,Field 方法和 SetField 方法之泛型參數 T 中指定的資料型別必須與基礎值的型別相符,否則系統將擲回 InvalidCastException。此外,指定的資料行名稱也必須與 DataSet 中的資料行名稱相符,否則系統將擲回 ArgumentException。在這兩種情況中,其例外狀況 (Exception) 是在執行查詢的資料列舉執行階段中擲回。

請參閱

概念

跨資料表查詢 (LINQ to DataSet)

查詢具型別 DataSet

泛型 Field 和 SetField 方法 (LINQ to DataSet)