LINQ to DataSet 之单表查询

Posted wangcongsuibi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>数据集合,然后是对集合进行操作







以上是关于LINQ to DataSet 之单表查询的主要内容,如果未能解决你的问题,请参考以下文章

LinQ To DataSet

LINQ to DataSet

mysql之单表查询__我自己敲的代码

如何在 LINQ to DataSet 的匿名类中使用基于查询数据的条件?

怎么用linq to sql 写单表多字段的模糊查询方法

LINQ to Dataset 是 LINQ to EF 的子集还是这两者是独立的?