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

来源:互联网 发布:淘宝店铺宝贝素材图片 编辑:程序博客网 时间:2024/06/15 02:51
在前面我们学习的内容当中,我们发现在LINQ里面,不能动态拼接LINQ语句,也就是说不能像Exec(@sql)那样去拼接并执行,可以理解成这是因为LINQ是强类型,@sql是字符串,是弱类型。那么如果我们需要统计的字段,是动态显示的,我们应该怎么做呢。例如下面的数据表格: sidStudentSubjectScore1学生A中文801学生A数学781学生A英语922学生B中文892学生B数学872学生B英语753学生C中文923学生C数学743学生C英语654学生D中文794学生D数学834学生D英语815学生E中文735学生E数学845学生E英语935学生E政治856学生F政治696学生F中文796学生F数学866学生F英语847学生G数学907学生G政治77

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

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

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

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

 1.学生表studentdata. 2.学科表subjectdata. SidStudent1学生A2学生B3学生C4学生D5学生E6学生F7学生G8学生HSidsubjectshuxue数学yingyu英语zhengzhi政治zhongwen中文

3.学生成绩表StudentsScore sidStudentSubjectScore1学生A中文801学生A数学781学生A英语922学生B中文892学生B数学872学生B英语753学生C中文923学生C数学743学生C英语654学生D中文794学生D数学834学生D英语815学生E中文735学生E数学845学生E英语935学生E政治856学生F政治696学生F中文796学生F数学866学生F英语847学生G数学907学生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();

 

 

 

 
原创粉丝点击