先说明一下这篇文章需要用到的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()方法。
#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