通常一个数据集(DataSet)里,包含有一个或者多个数据表(DataTable)。数据表之间如果具有一定的关联关系,从而就表示一个关系型数据库。在接下来的例子里我们创建多个数据表(DataTable),使用Linq查询多个表中的数据。
创建数据源
static DataSet BuildOneDTDataSet() { string[] nameset = { "张三", "李思思", "lisi", "王五", "路六", "欧赔", "夏琪","王二麻子" }; string[] xbSet = { "男", "女", "男", "女", "男", "女", "男", "女" }; int[] ageSet = { 12, 45, 23, 45, 78, 56, 12, 22 }; int[] ScoreID = { 1, 2, 3, 4, 5, 6, 7, 8 }; 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")), new DataColumn("ScoreID",Type.GetType("System.Int32")) } ); DataTable dtScore = new DataTable("Scores");//新建一个分数表 dtScore.Columns.AddRange( new DataColumn[] { new DataColumn("ScoreID",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")) } ); dtScore.Rows.Add(1,80,60,70); dtScore.Rows.Add(2, 40, 50, 60); dtScore.Rows.Add(3, 90, 90, 90); dtScore.Rows.Add(4, 30, 55, 77); for (int i = 0; i < nameset.Length; i++) //将数据写进一张datatable表 { //DataRow row = dt.NewRow(); DataRow row = dt.NewRow(); row["Name"] = nameset[i]; row["Age"] = ageSet[i]; row["XingBie"] = xbSet[i]; row["ScoreID"] = ScoreID[i]; dt.Rows.Add(row); } ds.Tables.Add(dtScore); return ds; }
多表查询
static void UseSelectTables() { DataSet ds = BuildOneDTDataSet(); DataTable student = ds.Tables["PeopleDt"];//学生表 DataTable score = ds.Tables["Scores"];//分数表 //查询集合中所有的学生的成绩,没有成绩则不作为结果返回 //var query = from stu in student.AsEnumerable() // join sco in score.AsEnumerable() // on stu.Field<int>("ScoreID") equals sco.Field<int>("ScoreID") // into valGrp // select valGrp; var query = from stu in student.AsEnumerable() from sco in score.AsEnumerable() where stu.Field<int>("ScoreID") == sco.Field<int>("ScoreID") select new { Name = stu.Field<string>("Name"), Math = sco.Field<int>("Math"), Chinese = sco.Field<int>("Chinese"), English = sco.Field<int>("English") }; //group stu by stu.Field<string>("Name"); foreach (var item in query) { Console.WriteLine("姓名:{0},数学{1},语文{2},英语{3}",item.Name,item.Math,item.Chinese,item.English); } }
关于多表查询需要输出两个表综合结果的时候,末尾select new{
a=...,
b=..,
}
最后循环输出的时候就可以直接item点出a,b了。
使用差集的方式查询出没有成绩的学生的详细信息,关于交并差集参见 Lambda常用函数