LinQ查询基础(三)LINQ to ADO.net(1)LINQ to DataSet实现复杂数据查询

先说明一下这篇文章需要用到的DataSet
        /// <summary>
        /// 创建一个有一张(姓名,年龄,性别)3个字段表格的DataSet
        /// </summary>
        /// <returns></returns>
        public static DataSet GetDataSet()
        {
            string[] nameSet = { "张三", "李四", "王五", "赵六", "李翠花", "吴霞", "周八", "李秀兰", "李云龙" };
            string[] genderSet = { "男", "男", "女", "男", "女", "女", "男", "女", "男" };
            int[] ageSet = { 18, 20, 21, 22, 19, 20, 18, 26, 24 };

            DataSet ds = new DataSet("PeopleDs");
            DataTable dt = new DataTable("PeopleDt");

            ds.Tables.Add(dt);

            dt.Columns.AddRange(new DataColumn[]
            {
                new DataColumn("name",Type.GetType("System.String")),
                new DataColumn("gender",Type.GetType("System.String")),
                new DataColumn("age",Type.GetType("System.Int32"))
            });

            for (int i = 0; i < nameSet.Length; i++)
            {
                DataRow row = dt.NewRow();
                row["name"] = nameSet[i];
                row["gender"] = genderSet[i];
                row["age"] = ageSet[i];
                dt.Rows.Add(row);
            }

            return ds;
        }

        /// <summary>
        /// 创建一个有一张(姓名,年龄,性别,成绩表好)4个字段表格和一张(成绩编号,数学成绩,语文成绩,英语成绩)4个字段的表的DataSet
        /// </summary>
        /// <returns></returns>
        public static DataSet BulidDataSet()
        {
            string[] nameSet = { "张三", "李四", "王五", "赵六", "李翠花", "吴霞", "周八", "李秀兰", "李云龙" };
            string[] genderSet = { "男", "男", "女", "男", "女", "女", "男", "女", "男" };
            int[] ageSet = { 18, 20, 21, 22, 19, 20, 18, 26, 24 };
            int[] math = { 70, 80, 90, 50, 86, 78, 76, 65 };
            int[] chinese = { 80, 85, 86, 75, 81, 74, 77, 95 };
            int[] english = { 77, 76, 80, 55, 62, 66, 74, 85 };

            DataSet ds = new DataSet("Students");
            DataTable dt = new DataTable("StuDt");
            ds.Tables.Add(dt);
            DataTable dts = new DataTable("ScoDt");
            ds.Tables.Add(dts);

            dt.Columns.AddRange(new DataColumn[]
            {
                new DataColumn("name",Type.GetType("System.String")),
                new DataColumn("gender",Type.GetType("System.String")),
                new DataColumn("age",Type.GetType("System.Int32")),
                new DataColumn("id",Type.GetType("System.Int32"))
            });

            for (int i = 0; i < nameSet.Length; i++)
            {
                DataRow row = dt.NewRow();
                row["name"] = nameSet[i];
                row["gender"] = genderSet[i];
                row["age"] = ageSet[i];
                row["id"] = i + 1;
                dt.Rows.Add(row);
            }

            dts.Columns.AddRange(new DataColumn[]
            {
                new DataColumn("id",Type.GetType("System.Int32")),
                new DataColumn("math",Type.GetType("System.Int32")),
                new DataColumn("chinese",Type.GetType("System.Int32")),
                new DataColumn("english",Type.GetType("System.Int32"))
            });

            for (int i = 0; i < math.Length; i++)
            {
                DataRow row = dts.NewRow();
                row["id"] = i + 1;
                row["math"] = math[i];
                row["chinese"] = chinese[i];
                row["english"] = english[i];
                dts.Rows.Add(row);
            }

            return ds;
        }

3.1.1 使用LINQ toDataSet

    LINQ to DataSet 可以简单理解成通过LINQDataSet中保存的数据进行查询。通常包含以下步骤:

1)获取DataSet/DataTable数据源

2)将DataTable转换成IEnumerable<T>类型

3)使用LINQ语法编写程序

4)使用查询结果

由于DataSet本身是DataTable的集合,包含多个DataTable和它们之间的关系,所以LINQ to DataSet实际是对DataTable进行数据查询。

 

3.1.2 查询单个数据表

在对DataTable进行数据查询时,必须使用DataTable类的AsEnumberable()方法。

扫描二维码关注公众号,回复: 1666615 查看本文章
            #region 单表查询

            DataSet ds = GetDataSet();
            DataTable dt = ds.Tables["PeopleDt"];

            //查询dt中的所有记录 演示AsEnumerable()和Field<T>()的使用
            var query =
                from v in dt.AsEnumerable()
                select v;
            Console.WriteLine("Query1:");
            foreach (var v in query)
            {
                Console.WriteLine("姓名:{0}, 性别:{1}, 年龄:{2}", v.Field<string>("name"), v.Field<string>("gender"), v.Field<int>("age"));
            }
            //条件查询
            var query1 =
                from v in dt.AsEnumerable()
                orderby v.Field<int>("age") descending
                where v.Field<int>("age") > 20
                where (int)v["age"] < 25
                select v.Field<string>("name");
            Console.WriteLine("Query2:");
            foreach (var v in query1)
                Console.Write(v + "    ");

            #endregion
查询结果:

3.1.3查询多个表 

查询的方法有很多种,在解决问题时应该尽可能寻找更多方法,从而得到最简单有效并且适用的那种方法。

            #region 多表查询
            DataSet StuDS = BulidDataSet();
            DataTable StuDt = StuDS.Tables["StuDt"];
            DataTable ScoDt = StuDS.Tables["ScoDt"];

            //查询所有有成绩的学生信息
            var query =
                from stu in StuDt.AsEnumerable()
                from sco in ScoDt.AsEnumerable()
                where (int)stu["id"] == (int)sco["id"]
                select stu;

            Console.WriteLine("有成绩的学生:");
            foreach (var v in query)
                Console.WriteLine("姓名:{0}, 性别:{1}, 年龄:{2}", (string)v["name"], v.Field<string>("gender"), (int)v["age"]);

            Console.WriteLine();

            //查询所有没有成绩的学生
            var query2 = StuDt.AsEnumerable().Except(query);

            Console.WriteLine("没有成绩的学生:");
            foreach (var v in query2)
                Console.WriteLine("姓名:{0}, 性别:{1}, 年龄:{2}", (string)v["name"], v.Field<string>("gender"), (int)v["age"]);
            #endregion
查询结果:

3.1.4用查询数据创建数据表及修改表中字段数据

LINQ to DataSet通过DataTableExtensions类提供的扩展方法CopyToDataTable()将查询结果直接复制到一个新的数据表中,从而可以将查询结果绑定到界面控件(DataGridView),也可以使用DataTable的一些特性。

            DataSet StuDS = BulidDataSet();
            DataTable StuDt = StuDS.Tables["StuDt"];
            DataTable ScoDt = StuDS.Tables["ScoDt"];

            //查询所有有成绩并且年龄大于20的学生信息
            var query =
                from stu in StuDt.AsEnumerable()
                from sco in ScoDt.AsEnumerable()
                where (int)stu["id"] == (int)sco["id"]
                where (int)stu["age"] > 20
                select stu;

            //通过CopyToDataTable()方法创建新的副本
            DataTable newDt = query.CopyToDataTable<DataRow>();

            foreach (var v in newDt.AsEnumerable())
                Console.WriteLine("姓名:{0}, 性别:{1}, 年龄:{2}", v["name"], v["gender"], v["age"]);

            Console.WriteLine();
            //通过SetField()方法修改表中字段数据
            foreach (var v in newDt.AsEnumerable())
            {
                int age = v.Field<int>("age");
                v.SetField<int>("age", age + 2);
            }

            foreach (var v in newDt.AsEnumerable())
                Console.WriteLine("姓名:{0}, 性别:{1}, 年龄:{2}", v["name"], v["gender"], v["age"]);
输出结果:

3.1.5使用数据视图DataView

            #region 数据视图DataView
            DataSet ds = GetDataSet();
            DataTable dt = ds.Tables[0];

            //用DataTable的AsDataView()方法创建DataView
            DataView DV1 = dt.AsDataView();

            //用LINQ获取特定条件的信息的DataView
            EnumerableRowCollection<DataRow> query =
                from v in dt.AsEnumerable()
                where v.Field<string>("name").StartsWith("李")
                orderby (int)v["age"] descending
                select v;
            DataView DV2 = query.AsDataView();

            //DataView类的RowFilter和Sort属性对数据进行过滤
            DataView dv = dt.AsDataView();
            //RowFilter属性设置筛选条件 年龄大于20
            dv.RowFilter = "age > 20";
            //为RowFilter属性赋值为null或String.Empty,清除过滤信息,二选一
            dv.RowFilter = null;
            dv.RowFilter = string.Empty;
            //通过Sort对信息排序
            dv.Sort = "age asc, name desc";
            //为Sort属性赋值为null或String.Empty,清除过滤信息,二选一
            dv.Sort = null;
            dv.Sort = string.Empty;
            #endregion

猜你喜欢

转载自blog.csdn.net/hebizhi1997/article/details/80208480