sid | Student | Subject | Score |
---|---|---|---|
1 | 学生A | 中文 | 80 |
1 | 学生A | 数学 | 78 |
1 | 学生A | 英语 | 92 |
2 | 学生B | 中文 | 89 |
2 | 学生B | 数学 | 87 |
2 | 学生B | 英语 | 75 |
3 | 学生C | 中文 | 92 |
3 | 学生C | 数学 | 74 |
3 | 学生C | 英语 | 65 |
4 | 学生D | 中文 | 79 |
4 | 学生D | 数学 | 83 |
4 | 学生D | 英语 | 81 |
5 | 学生E | 中文 | 73 |
5 | 学生E | 数学 | 84 |
5 | 学生E | 英语 | 93 |
5 | 学生E | 政治 | 85 |
6 | 学生F | 政治 | 69 |
6 | 学生F | 中文 | 79 |
6 | 学生F | 数学 | 86 |
6 | 学生F | 英语 | 84 |
7 | 学生G | 数学 | 90 |
7 | 学生G | 政治 | 77 |
我们需要对这个表格进行数据分析,分析每个学生各学科的成绩情况,最终如下表格:
姓名 | 数学 | 英语 | 政治 | 中文 |
---|---|---|---|---|
学生A | 78 | 92 | 80 | |
学生B | 87 | 75 | 89 | |
学生C | 74 | 65 | 92 | |
学生D | 83 | 81 | 79 | |
学生E | 84 | 93 | 85 | 73 |
学生F | 86 | 84 | 69 | 79 |
学生G | 90 | 77 | ||
学生H |
这个问题,貌似不能像我们平时写SQL语句那样方便,想了很久,最后采用了一个比较实在的方法,用DataTable将我得到的数据进行填充。
接下来我们开始做这个例子,做开始这里例子之前,我们需要有如下3张表格数据:
1.学生表studentdata. | 2.学科表subjectdata. | ||||||||||||||||||||||||||||
|
|
3.学生成绩表StudentsScore
sid | Student | Subject | Score |
---|---|---|---|
1 | 学生A | 中文 | 80 |
1 | 学生A | 数学 | 78 |
1 | 学生A | 英语 | 92 |
2 | 学生B | 中文 | 89 |
2 | 学生B | 数学 | 87 |
2 | 学生B | 英语 | 75 |
3 | 学生C | 中文 | 92 |
3 | 学生C | 数学 | 74 |
3 | 学生C | 英语 | 65 |
4 | 学生D | 中文 | 79 |
4 | 学生D | 数学 | 83 |
4 | 学生D | 英语 | 81 |
5 | 学生E | 中文 | 73 |
5 | 学生E | 数学 | 84 |
5 | 学生E | 英语 | 93 |
5 | 学生E | 政治 | 85 |
6 | 学生F | 政治 | 69 |
6 | 学生F | 中文 | 79 |
6 | 学生F | 数学 | 86 |
6 | 学生F | 英语 | 84 |
7 | 学生G | 数学 | 90 |
7 | 学生G | 政治 | 77 |
关系图如下:
现在我们开始写后台代码:
StudentDataContext db = new StudentDataContext();
DataTable dt = new DataTable();
dt.Columns.Add("姓名", typeof(string));
//输出课程表的所有数据,并将这些数据附加到dt的列作为字段
var sub = db.SubjectData;
foreach (var sd in sub)
{
dt.Columns.Add(sd.subject);
}
//输出学生表的所有数据,并将这些数据附加到dt的行
var data = db.StudentData;
foreach (var user in data)
{
DataRow dr = dt.NewRow();
dr["姓名"] = user.Student;
dt.Rows.Add(dr);
}
//我们这里是要分析每个学生各科的成绩(一个学生有多门学科的成绩)
for (int i = 0; i < dt.Rows.Count; i++)
{
foreach (var sd in sub)
{
string str = dt.Rows[i]["姓名"].ToString();
var query = from p in db.StudentsScore
where p.Student.Equals(str) && p.Subject.Equals(sd.subject)
select new
{
p.Student,
p.Score
};
foreach (var sc in query)
{
DataRow dr = dt.NewRow();
dt.Rows[i][sd.subject] = sc.Score.ToString();
break;
}
}
}
gd.DataSource = dt;
gd.DataBind();
到这里我们的动态字段分析,就完成了。
附录:几种LINQ to SQL 数据访问形式:
//第一种数据访问形式
IDbConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=p@ssw0rd");
DataContext ctx = new DataContext(conn);
Table<InStore> tbInStore = ctx.GetTable<InStore>();
gd.DataSource = tbInStore;
gd.DataBind();
//第二种数据访问形式
InStoreDataContext db = new InStoreDataContext();
Table<InStore> tbInStore = db.GetTable<InStore>();
gd.DataSource = tbInStore;
gd.DataBind();
//第三种数据访问形式
InStoreDataContext db = new InStoreDataContext();
var predicate = PredicateBuilder.True<InStore>();
List<InStore> tbInStore = db.InStore.Where(predicate).ToList();
var query = from InStore store in tbInStore select new { store.Id, store.ProName };
gd.DataSource = query;
gd.DataBind();