先说明一下这篇文章需要用到的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 可以简单理解成通过LINQ对DataSet中保存的数据进行查询。通常包含以下步骤:
(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