LINQ to DataSet/DataTable
阿新 • • 發佈:2019-01-26
CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記
一個DataSet通常包含一個或多個DataTable,同時也包括它們之間的關係集合等,實際上可以把它看成是一個縮影的資料庫。LINQ to DataSet也是對一個或多個DataTable進行查詢,這些DataTable可以來自單個DataSet,也可以是來自多個DataSet。
LINQ to DataSet的使用通常包含以下步驟:
(1)獲取DataSet/DataTable資料來源
(2)將DataTable轉換成IEnumerable<T>型別。LINQ只能在IEnumerable<T>或 IQueryable<T>介面物件上執行查詢操作,而
DataTable並沒有實現這兩個介面,不能直接查詢。在LINQ to DataSet中,通過DataTableExtensions擴充套件的AsEnumerable()方法從DataTable獲取一個等價的IEnumerable<T>物件。
(3)使用LINQ語法編寫查詢。
注意:由於DataSet本身是DataTable的集合,它可以包含一個或多個DataTable及它們之間的關係,LINQ to DataSet實際是對DataTable進行資料查詢,並非對DataSet進行查詢。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; namespace LinqToDataSet { class Program { static void Main(string[] args) { UseSelect(); Console.Read(); } /// <summary> /// 造一個dataset資料集 /// </summary> /// <returns></returns> static DataSet BuildOneDTDataSet() { //可選姓名、性別和年齡,用於建立學生資料到資料表中 string[] nameSet = { "王霞", "張三", "李四", "李花", "王五", "陸六", "夏七", "吳八" }; string[] xbSet = { "女", "男", "男", "女", "男", "男", "男", "男" }; int[] ageSet = { 18, 20, 21, 22, 19, 20, 25, 24 }; DataSet ds = new DataSet("PeopleDS"); //建立名為PeopleDS的DataSet物件 DataTable dt = new DataTable("PeopleDT"); //建立名為PeopleDT的DataTable物件 ds.Tables.Add(dt); //將資料表dt新增到資料集ds中 //建立DataTable的列(欄位)資訊,包括3個欄位: //姓名:Name,string型別 //性別:XingBie,string型別 //年齡:Age,int型別 dt.Columns.AddRange( new DataColumn[] { new DataColumn("Name", Type.GetType("System.String")), new DataColumn("XingBie", Type.GetType("System.String")), new DataColumn("Age", Type.GetType("System.Int32")), }); //利用前面定義的可選姓名nameSet、年齡ageSet、性別xbSet建立多個學生資訊 for (int i = 0; i < nameSet.Length; i++) { //根據當前編號,自動新建資料表中的一行,併產生一行資料 //然後通過DataTable.Rows.Add()將這一行新增到資料表dt中 DataRow row = dt.NewRow(); row["Name"] = nameSet[i]; row["Age"] = ageSet[i]; row["XingBie"] = xbSet[i]; dt.Rows.Add(row); //新增到資料表dt中 } return ds; //返回DataSet } static void UseSelect() { DataSet ds = BuildOneDTDataSet(); //獲取資料集ds DataTable dt = ds.Tables["PeopleDT"]; //從資料集ds中獲取名為“PeopleDT”的資料表dt //查詢query1表示查詢DataTable中所有記錄,演示AsEnumerable()的使用 //返回EnumerableRowCollection<DataRow>集合 var query1 = from pl in dt.AsEnumerable() select pl; System.Console.WriteLine("Query1:"); foreach (var item in query1) { //演示Field<T>方法的使用 //Console.WriteLine("姓名:{0},性別:{1},年齡:{2}",item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age")); Console.WriteLine("姓名:{0},性別:{1},年齡:{2}", item["Name"], item["XingBie"], item["Age"]); } //查詢query2表示查詢DataTable中所有人的姓名,演示AsEnumerable()和Field<T>的使用 var query2 = from pl in dt.AsEnumerable() select pl.Field<string>("Name"); System.Console.WriteLine("Query2:"); //列印查詢query1的結果 foreach (var item in query2) { System.Console.Write("{0} ", item); } System.Console.WriteLine(); //查詢query3 where 返回list<datarow> var query3 = dt.AsEnumerable().Where(r => r.Field<int>("Age") > 24).ToList(); System.Console.WriteLine("Query3:"); //列印查詢query3的結果 foreach (DataRow dr in query3) { //讀取datarow值 System.Console.Write("{0} ", dr.Field<string>("Name")); System.Console.Write("{0} ", dr["age"].ToString()); //修改datarow值 //dr.SetField<int>("age", dr.Field<int>("Age") + 100); dr["age"] = Convert.ToInt32(dr["age"]) + 1001; } foreach (DataRow dr in query3) { System.Console.Write("{0} ", dr.Field<string>("Name")); System.Console.Write("{0} ", dr["age"].ToString()); } } } }