第20章 LINQ 資料查詢技術 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或拷貝
第二十章 LINQ 資料查詢技術 20.1 LINQ 簡介 20.2 如何撰寫 LINQ 查詢 20.3 LINQ to Objects 20.4 LINQ to XML 20.5 LINQ to SQL 20.6 LINQ to DataSet
20.1 LINQ 簡介 LINQ (Language-Integrated Query)資料查詢技術。 應用程式經常會在 陣列、集合、DataSet 物件、XML、SQL Server 資料庫中查詢指定的資料或進行資料排序。 不同資料來源進行查詢或排序須用不同查詢技術 或資料結構方能達成。 如在陣列中搜尋資料,可用 二分搜尋法、循序搜尋法或其它資料結構 .NET Framework 的 Array 類別的 Binary Search 靜態方法傳回欲搜尋陣列元素索引位置
20.1 LINQ 簡介 Contiunue... 若要查詢 DataSet 內 DataTable 的某一筆資料列 可用 DataTable.Rows 集合的 Find 方法傳回 欲搜尋的資料列。 查詢 SQL Server資料庫,可用 SQL 語法。 查詢 XML 文件,可用 XQuery。 面對上述不同資料來源 須學習不同資料查詢技術 才能擷取這些資料並加運用。
20.1 LINQ 簡介 Contiunue... 在 .NET Framework 3.5 新增 LINQ 資料查詢技術,讓設計師能用一致性 語法來查詢不同資料來源 如查詢陣列、集合、DataSet、XML、SQL Server 資料庫等,不需再學習不同資料查詢技術。 LINQ 最大特質 具備資料查詢能力及語言進行整合能力 具備像 SQL Query 查詢功能 可直接和 VB 與 C# 語法進行整合 使得 VB 和 C# 內建查詢的功能。
LINQ 依使用對象分成4種技術類型 1. LINQ to Objects 可查詢實作 IEnumerable 或 IEnumerable<T> 介面集合 物件,如查詢陣列、List、集合、檔案…等物件。 2. LINQ to XML LINQ to XML是一種用於 XML 查詢技術的API, 透過 LINQ 查詢運算式可查詢或排序 XML 文件, 不需額外學習 XPath 或 XQuery。 3. LINQ to SQL 可對實作 IQueryable<T> 介面的物件做查詢,也可直接 對 SQL Server 和 SQL Server Express 資料庫做查詢與編輯。 4. LINQ to DataSet 透過 LINQ 查詢運算式,可針對記憶體內的 DataSet 或 DataTable 進行查詢。
LINQ 帶來的優點: 1. 可用熟悉語法撰寫 LINQ 查詢運算式, 使用時須配合 VB 2008 或 C# 2008 與 .NET Framework 3.5 以上版本才行。 2. 使用統一的 LINQ 語法 查詢不同類型資料來源,不用額外學習其它 資料查詢技術。 降低學習負擔及專案維護成本。 3. 編譯時語法檢查與資料型別安全檢查, 提高程式資料查詢正確性。
LINQ 帶來的優點: Continue… 4. 獲得VS 2013 整合開發環境的 IntelliSense支援 撰寫 LINQ 查詢運算式時出現提示子句 或輸入「.」時,皆有相關屬性與方法列出 供您選取,不用牢記 SQL 語法。 5. 可在記憶體修改 XML文件,功能比 XPath、 XQuery更強大,更容易使用。 6. 功能強大的查詢、排序與分組功能。
20.2 如何撰寫 LINQ 查詢 查詢陣列、集合物件、DataSet、XML或 SQL Server 資料庫,LINQ 查詢語法的基本結構都是相同。 LINQ 查詢運算式(Query Expression) 先以 from 子句開頭用來指定範圍變數及要查詢 集合,此時會將集合內元素放到範圍變數中 進行查詢。 使用orderby 子句定義查詢結果的排序方式。 使用 where 設定查詢的條件。 使用 select 子句定義查詢結果要傳回欄位名稱。 最後將查詢結果傳回給指定變數。
查詢運算式語法有點類似 SQL語法,語法:
撰寫 LINQ 基本包含三階段 Step1 定義資料來源 Step2 撰寫查詢運算式 Step3 執行查詢。 以三階段練習撰寫可查詢 score 陣列中大於等於 某數(txtInput.Text)資料的 LINQ 程式。 參考範例 Linq_to_Object1.sln
執行結果: 參照 P20- 5 頁
設計輸出入介面
20.3 LINQ to Objects 使用 LINQ 語法來查詢物件的方式,只要是實作 IEnumerable<T> 介面的物件,如陣列、 List、 集合…等,皆可用LINQ to Objects 來進行查詢。 參照 P 20-8 頁
輸出結果 參照 P 20-8 頁
輸出入介面設計 參閱 P20- 9 頁
20.4 LINQ to XML LINQ to XML是用LINQ 語法來查詢、建立、 存取XML的技術,透過 LINQ 查詢語言即可 操作 XML文件,不用再學習其它的 XML類別、API、 XPath、XQuery等技術 透過 LINQ to XML撰寫 XML 程式變得簡單許多。 下面示範查詢 person.xml 文件寫法, 操作步驟 參閱 P20-11 頁
假設 person.xml 文件內容如下:
操作步驟 參閱 P 20-13頁
輸出入介面設計
輸出入介面設計 程式碼 請參閱 P20-14 頁
20.5 LINQ to SQL 20.5.1 LINQ to SQL簡介 LINQ to SQL是 LINQ 查詢技術功能之一。 是一種物件模型(Object Model) 與 關連式資料庫 Mapping 的技術。 將資料庫、資料表、資料列、資料欄位、主鍵、 限制及關聯都可直接對應至程式設計中的物件。
20.5.1 LINQ to SQL 簡介 Continue… 在查詢、新增、修改、刪除資料庫程式時, 不用再撰寫 SQL Server 資料庫的 SELECT、 INSERT、DELETE、UPDATE 敘述 因底層已處理,讓你不用處理資料庫程式設計 細節以直覺物件導向方式撰寫資料庫程式。 LINQ to SQL目前支援微軟的 SQL Server, 不支援其它廠商的資料庫。
LINQ to SQL的物件模型
20.5.2 如何自定類別撰寫 LINQ to SQL程式 LINQ to SQL 是一種與關聯式資料庫對應的技術, 資料庫會與程式中的物件直接對應。 如何將程式中的物件與資料庫做對應? 先將類別宣告為 Entity 類別,並將類別的成員對應到 資料表的欄位。 接著透過 DataContext 類別將 SQL Server資料庫 與程式中的類別成員進行對應。 最後可用 LINQ 查詢運算式進行查詢資料的動作。 DataContext 是 LINQ to SQL 的類別, 該類別包含連接到資料庫的連接字串, 若要更新資料透過 SubmitChanges方法將指定物件 寫回資料表內。
20.5.2 如何自定類別撰寫 LINQ to SQL程式 操作步驟 請參閱 P20-17頁 範例 Linq_to_SQL1.sln 練習如何將 Employee類別 對應到「員工」資料表。如下圖,dataGridView1 上會顯示員工資料表的所有記錄。 操作步驟 請參閱 P20-17頁
欄位設定 操作步驟 請參閱本章 P20-18 頁
操作步驟 請參閱 P20-22 頁
20.5.3 用O/R 設計工具撰寫 LINQ to SQL程式 VS 2013或VS Express 2013 for Windows Desktop 提供 O/R 設計工具 透過拖拉方式即可動態產生Entity 類別。 Entity 類別 可直接對應至 SQL Server資料庫實體的資料表。 範例示範 操作步驟 請參閱本章 P20-24 頁
操作步驟 參閱 P20-28頁
輸出結果 操作步驟 請參閱 P20-28頁
輸出入介面設計 操作步驟 請參閱本章 P29-36頁
20.5.4 如何使用 LINQ to SQL 編輯資料表記錄 DataContext 物件提供 InsertOnSubmit 方法 可在記憶體中新增一筆記錄(即Entity物件) 透過 DeleteOnSubmit 方法可刪除指定記錄。 當編輯記憶體資料後 透過 DataContext 物件提供 SubmitChanges 方法 將對應到資料表的 Entity 物件寫回資料庫中。 練習如何透過 LINQ to SQL來新增、修改、刪除 員工資料表的記錄。
操作步驟 請參閱 P20-36頁
輸出入介面設計 操作步驟 請參閱 P20-36頁
20.6 LINQ to DataSet 20.6.1 LINQ to DataSet 簡介 LINQ to DataSet 著重強化記憶體 DataSet 查詢能力。 可將異質性資料庫的資料填入 DataSet 內, 再用 LINQ to DataSet 進行查詢 DataSet。 LINQ to DataSet 適用於各類型資料庫。 若使用非 SQL Server 資料庫,可用 LINQ to DataSet 來強化應用程式的查詢能力。
20.6.1 LINQ to DataSet 簡介 DataSet 分為 具型別DataSet 與 不具型別DataSet。 不具型別 DataSet是 第16章直接使用 「DataSet ds = new DataSet();」 敘述所產生的 DataSet。 由於 LINQ to DataSet 只能查詢有實作 IEnumerable 或 IEnumerable<T> 介面的 DataTable 物件, 不具型別的 DataSet 的 DataTable 沒實作IEnumerable 或 IEnumerable <T> 介面。
19.6.1 LINQ to DataSet 簡介 Continue... ADO .NET 4.5 的 DataTable 提供兩個擴充方法, 使 DataSet 與 DataTable 支援 LINQ to DataSet 查詢: 1. AsDataView(): 傳回支援 LINQ 查詢的 DataView 物件。 2. AsEnumerable(): 傳回實作IEnumerable <T> 泛型物件,泛型參數 T 為 DataRow。透過此方法使 DataTable 可用 LINQ 進行查詢。
20.6.1 LINQ to DataSet 簡介 Continue... 使用 LINQ 查詢運算式查詢不具型別 DataSet 得到查詢結果後,接著將查詢結果進行資料繫結。 若LINQ 查詢結果不具資料繫結功能 可透過三種方式 來達成: 1. 透過AsDataView()方法 將查詢結果轉成DataView物件。 2. 透過ToList() 方法 將查詢結果轉成List<T> 泛型物件。 3. 透過 CopyToDataTable()方法或自訂新的 DataTable 將查詢結果轉成 DataTable 物件。 若使用 具型別 DataSet 則沒有上面問題。
20.6.2 用 LINQ to DataSet 查詢不具型別 DataSet
操作步驟 請參閱 P20-43頁
輸出入介面設計 操作步驟 請參閱 P20-43頁
20.6.3 用 LINQ to DataSet 查詢具型別 DataSet 除須用AsEnumerable方法將 DataTable 轉成 IEnumerable<T> 泛型物件 以便進行 LINQ 查詢外 還要透過 Field<T> 方法進行型別轉換等麻煩事。 若透過 LINQ to DataSet 來查詢 具型別 DataSet 上述這些問題將迎刃而解。
20.6.3 用 LINQ to DataSet 查詢具型別 DataSet 透過 Linq_to_DataSet2.sln 範例說明如何使用 「DataSet設計工具」來設計具型別DataSet 接著透過 LINQ to DataSet 來查詢具型別 DataSet。 本例執行結果與Linq_to_DataSet1.sln 同。 操作步驟 請參閱 P20-46頁
輸出入介面設計
本章結束 …