linq to sql 学习(9)linq的多表关联汇总

原创 2010年07月15日 11:25:00

①,我们准备两张数据表:

学生资料表:StudentData

if exists (select * from sysobjects where id = OBJECT_ID('[StudentData]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)

DROP TABLE [StudentData]

 

CREATE TABLE [StudentData] (

[Sid] [int]  NOT NULL,

[Student] [varchar]  (50) NULL)

 

ALTER TABLE [StudentData] WITH NOCHECK ADD  CONSTRAINT [PK_StudentData] PRIMARY KEY  NONCLUSTERED ( [Sid] )

INSERT [StudentData] ([Sid],[Student]) VALUES ( 1,'学生A')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 2,'学生B')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 3,'学生C')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 4,'学生D')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 5,'学生E')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 6,'学生F')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 7,'学生G')

INSERT [StudentData] ([Sid],[Student]) VALUES ( 8,'学生H')

 

SidStudent
1 学生A
2 学生B
3 学生C
4 学生D
5 学生E
6 学生F
7 学生G
8 学生H

 

学生成绩表StudentsScore

 

if exists (select * from sysobjects where id = OBJECT_ID('[StudentsScore]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)

DROP TABLE [StudentsScore]

 

CREATE TABLE [StudentsScore] (

[id] [int]  NOT NULL,

[sid] [int]  NULL,

[Student] [varchar]  (50) NULL,

[Subject] [varchar]  (50) NULL,

[Score] [int]  NULL)

 

ALTER TABLE [StudentsScore] WITH NOCHECK ADD  CONSTRAINT [PK_StudentsScore] PRIMARY KEY  NONCLUSTERED ( [id] )

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 1,1,'学生A','中文',80)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 2,1,'学生A','数学',78)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 3,1,'学生A','英语',92)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 4,2,'学生B','中文',89)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 5,2,'学生B','数学',87)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 6,2,'学生B','英语',75)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 7,3,'学生C','中文',92)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 8,3,'学生C','数学',74)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 9,3,'学生C','英语',65)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 10,4,'学生D','中文',79)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 11,4,'学生D','数学',83)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 12,4,'学生D','英语',81)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 13,5,'学生E','中文',73)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 14,5,'学生E','数学',84)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 15,5,'学生E','英语',93)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 16,6,'学生F','中文',79)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 17,6,'学生F','数学',86)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 18,6,'学生F','英语',84)

INSERT [StudentsScore] ([id],[sid],[Student],[Subject],[Score]) VALUES ( 19,7,'学生G','数学',90)

 

idsidStudentSubjectScore
1 1 学生A 中文 80
2 1 学生A 数学 78
3 1 学生A 英语 92
4 2 学生B 中文 89
5 2 学生B 数学 87
6 2 学生B 英语 75
7 3 学生C 中文 92
8 3 学生C 数学 74
9 3 学生C 英语 65
10 4 学生D 中文 79
11 4 学生D 数学 83
12 4 学生D 英语 81
13 5 学生E 中文 73
14 5 学生E 数学 84
15 5 学生E 英语 93
16 6 学生F 中文 79
17 6 学生F 数学 86
18 6 学生F 英语 84
19 7 学生G 数学 90

 

 

②,我们新建一个LINQ TO SQL类,名称为Student.dbml ,并将这两张表加到改窗体上。

 

③,我们新建一个页面,Student.aspx,我们这里面只放一个GridView视图控件,用来绑定数据。

接下来我们编写在Student.aspx.cs后台的代码,如下:

using System;

using System.Collections;

using System.Configuration;

using System.Data;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;

using System.Collections.Generic;

 

namespace LinqDemo

{

    public partial class Student : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            bind();

        }

        public void bind()

        {

            StudentDataContext db = new StudentDataContext();

            //学生资料表

            var pre1 = PredicateBuilder.True<StudentData>();

            List<StudentData> studentdataQuery = db.StudentData.Where(pre1).ToList();

 

            //学生成绩表

            var pre2 = PredicateBuilder.True<StudentsScore>();

            List<StudentsScore> studentsScoreQuery = db.StudentsScore.Where(pre2).ToList();

 

            //先算出学生成绩表中各学生的总分汇总

            var ssGroupByStu = from p in studentsScoreQuery

                               group p by new { p.sid, p.Student } into g

                               select

                                   new

                                   {

                                       Sid = g.Key.sid,

                                       Student = g.Key.Student,

                                       总分 = g == null ? 0 : g.Sum(a => a.Score)

                                   };

 

            //在左连接学生表

            var query = from sd in studentdataQuery

                        join

                        ss in ssGroupByStu

                        on sd.Sid equals ss.Sid into g

 

                        from j in g.DefaultIfEmpty()

                        select new

                        {

                            学号 = sd.Sid,

                            姓名 = sd.Student,

                            总分 = j == null ? 0 : j.总分,

                            评价 = j == null ? "暂无数据" : GetEvaluation(Convert.ToInt32(j.总分))

                        };

 

            //最后按照总分降序排序

            query = query.OrderByDescending(a => a.总分);

            gd.DataSource = query;

            gd.DataBind();

        }

 

        //对总分的判断

        private string GetEvaluation(int score)

        {

            if (score < 200)

            {

                return "太差了!";

            }

            else if (score > 200 && score<240)

            {

                return "还可以!";

            }

            else if (score >= 240 && score < 300)

            {

                return "还不错!";

            }

            else

            {

                return "";

            }

        }

    }

}

 

我们运行这个页面后,就得到如下结果。

学号姓名总分评价
2 学生B 251 还不错!
1 学生A 250 还不错!
5 学生E 250 还不错!
6 学生F 249 还不错!
4 学生D 243 还不错!
3 学生C 231 还可以!
7 学生G 90 太差了!
8 学生H 0 暂无数据
版权声明:本文为博主原创文章,未经博主允许不得转载。

C#Linq分组汇总

Linq分组分两种,一种是表分组汇总,另一种是List 第一种,表的分组汇总: DataTable table = new DataTable(); table.Columns.Add("列...
  • zjfjifei2008
  • zjfjifei2008
  • 2013年11月29日 08:38
  • 766

Linq语句汇总

常用Select操作举例       取得单个记录(ID为3的分类)
  • woluge
  • woluge
  • 2014年05月23日 13:35
  • 873

linq To SQl之关联表同步添加数据

//关联表同步添加数据 ,如订单和订单详细;用户和用户组别  protected void gvUser_RowInserting(object sender, DevExpress.Web.Data...
  • longer123123
  • longer123123
  • 2009年03月03日 22:33
  • 2910

LINQ编程之LINQ to SQL

最近比较忙,博客更新的比较慢,请大家谅解! 今天来简单介绍一下LINQ to SQL的知识。(用实例) 什么是LINQ to SQL?        LINQ to SQL是基于关系数据的.NE...
  • wyzhangchengjin123
  • wyzhangchengjin123
  • 2012年09月14日 10:56
  • 5133

LINQ学习心得分享----(一)LINQ简介和基础学习

这一节主要向大家讲三个问题,第一个问题什么是LINQ,第二个问题LINQ主要解决什么问题,第三个问题学习LINQ需要做哪些基本的准备。      首先第一个问题,什么是LINQ?LINQ中文翻译为语...
  • xuemoyao
  • xuemoyao
  • 2012年10月08日 11:27
  • 2692

Linq系列文章(一):Linq 是什么?Linq 和Linq to sql 的区别

Linq是微软在.net3.0推出的一种新的数据访问和处理的方式,来解决过去处理集合对象数据所遇到的种种困难。其中在C#3.0和VB9中分别引入了和SQL相似的Linq语法,使得现在操作各种数据对象变...
  • shatamadedongxi
  • shatamadedongxi
  • 2012年10月26日 09:53
  • 1068

LINQ能不能用系列(二)LINQ to SQL 效率比对

前言 很多人听说过LINQ TO SQL与ADO.NET Entity Framework用于不同的环境,LINQ TO SQL与ADO.NET Entity Framework也没有可比性,就像公...
  • liaobc
  • liaobc
  • 2012年05月18日 19:26
  • 3117

LINQ to SQL使用教程

LINQ to SQL使用教程 前些时间用LINQ to SQL做了一些项目,现在打算总结一下,帮助新手快速入门,并写一些别的教程没提到的东西。 一、LINQ to SQL和别的LINQ t...
  • moshansk
  • moshansk
  • 2017年09月04日 14:52
  • 386

LINQ To DataTable

static DataTable dtable = new DataTable(); static DataColumn dc = new DataColumn(); static DataR...
  • ws_hgo
  • ws_hgo
  • 2011年10月11日 10:28
  • 12444

LINQ 多表关联(inner join,left join)

var query = from t1 in dt.AsEnumerable()                         join t2 in dt2.AsEnumerable()    ...
  • qsbqing
  • qsbqing
  • 2013年09月28日 14:54
  • 10546
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linq to sql 学习(9)linq的多表关联汇总
举报原因:
原因补充:

(最多只允许输入30个字)