LINQ to DataSet 之单表查询

       查询单个数据表

       根据Linq to DataSet概述的步骤,

       第一步我们获取数据源,我们这里手动创建一个datatable数据源

 static DataSet BuildOneDTDataSet() {
            string[] nameset = { "张三", "李思思", "lisi", "王五", "路六", "欧赔", "夏琪","王二麻子" };
            string[] xbSet = { "男", "女", "男", "女", "男", "女", "男", "女" };
            int[] ageSet = { 12, 45, 23, 45, 78, 56, 12, 22 };
            DataSet ds = new DataSet("PeopleDs");//创建名为"PeopleDs"的dataset对象
            DataTable dt = new DataTable("PeopleDt");//创建名为PeopleDt的datatable对象
            ds.Tables.Add(dt);
            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")) } ); for (int i = 0; i < nameset.Length; i++) //将数据写进一张datatable表  { DataRow row = dt.NewRow(); row["Name"] = nameset[i]; row["Age"] = ageSet[i]; row["XingBie"] = xbSet[i]; dt.Rows.Add(row); } return ds; }

   第二步,将datatable转换成IEnumberable<T>类型,使用AsEnumerable(),结合linq语法进行查询

static void UseSelect() {
            DataSet ds = BuildOneDTDataSet();
            DataTable dt = ds.Tables["PeopleDT"];//从数据集中获取名为PeopleDt的数据表
            var query = from pl in dt.AsEnumerable() select pl;
            foreach (var item in query)
            {
                Console.WriteLine("姓名{0},年龄{1},性别{2}", item.Field<string>("Name"), item.Field<int>("Age"), item.Field<string>("XingBie"));
            }

            var query1 = from pl in dt.AsEnumerable() select pl.Field<string>("Name"); foreach (var item in query1) { Console.WriteLine(item); } //查询所有年龄大于22岁的记录 var query2 = from pl in dt.AsEnumerable() where pl.Field<int>("Age") > 22 orderby pl.Field<int>("Age") descending select pl; foreach (var item in query2) { Console.WriteLine("姓名{0},年龄{1}",item.Field<string>("Name"),item.Field<int>("Age")); } //查询所有年龄在20到40之间的记录 var query3 = from pl in dt.AsEnumerable() where pl.Field<int>("Age") > 20 && pl.Field<int>("Age") < 40 orderby pl.Field<int>("Age") ascending select pl; foreach (var item in query3) { Console.WriteLine("姓名{0},年龄{1}", item.Field<string>("Name"), item.Field<int>("Age")); } }

 特别注意到的错误:

  第一部分是手动创建Datable列表,

dt.Columns.AddRange给Datatable创建表结构,在下面for循环里进行给行添加数据的时候,DataRow dr =new DataRow(),这种写法是十分错误的

 

DataRow表示是DataTable中的一行数据,要实例化DataRow必须先实例Datatable,DataTable要确定DataaRow的结构。
DataRow的构造函数如下:
protected internal DataRow (
DataRowBuilder builder
)

DataRow是一个受保护的internal类。
internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的。

 一、ms这么做是有他的隐含意思在里面的:
一个table和他对应的row应该是有相同结构的,为了保证他们结构相同,就必须按照一个统一标准来规范他们.要么用table来规范row,那么让row去格式化table,ms选择了前一种方式,这里他们又隐含一层意思,那就是生成的顺序,table比row先生成.

所以为了严格保证这种规范和生成顺序,该构造函数就限制成了protected internal ,ok了,这么做,你就是想把table和row结构不对应都不成了,因为他没有留给你任何犯错的机会

所以这里我们应该使用     DataRow dr = dt.newRow();

 

简单来说,Linq to DataSet 查询Datatable 可以简单分成两部分,将DataTable转换成IEnumberable<T>数据集合,然后是对集合进行操作

转载于:https://www.cnblogs.com/wangcongsuibi/p/8867083.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值