linq to sql 学习(10)linq动态字段的解决方法

在前面我们学习的内容当中,我们发现在LINQ里面,不能动态拼接LINQ语句,也就是说不能像Exec(@sql)那样去拼接并执行,可以理解成这是因为LINQ是强类型,@sql是字符串,是弱类型。那么如果我们需要统计的字段,是动态显示的,我们应该怎么做呢。例如下面的数据表格:
sidStudentSubjectScore
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

我们需要对这个表格进行数据分析,分析每个学生各学科的成绩情况,最终如下表格:

姓名数学英语政治中文
学生A7892 80
学生B8775 89
学生C7465 92
学生D8381 79
学生E84938573
学生F86846979
学生G90 77 
学生H    

这个问题,貌似不能像我们平时写SQL语句那样方便,想了很久,最后采用了一个比较实在的方法,用DataTable将我得到的数据进行填充。

接下来我们开始做这个例子,做开始这里例子之前,我们需要有如下3张表格数据:

 1.学生表studentdata. 2.学科表subjectdata.
SidStudent
1学生A
2学生B
3学生C
4学生D
5学生E
6学生F
7学生G
8学生H
Sidsubject
shuxue数学
yingyu英语
zhengzhi政治
zhongwen中文

3.学生成绩表StudentsScore

sidStudentSubjectScore
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();

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值