DotNet 笔记

东方欲晓,莫道君起早。

LINQ to DataSet/ LINQ to DataTable

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

        }
    }
}

 

Loading