1. 程式人生 > >LINQ to DataSet/DataTable

LINQ to DataSet/DataTable

    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());
            }

        }
    }
}