(九)LINQ的八大子句

在我们之前的学习过程中,要想查询数据库中的数据,我们需要通过编写对应的SQL查询语句,对于不同的查询结果,我们需要编写不同的查询SQL语句,然而,在这些查询操作中,一般不会检擦被查询数据的类型。同时,这些查询操作往往与编程语言处于一种相对孤立的状态。那么能否实现通过我们的编程语言(比如:C#)直接来进行数据的查询呢?

答:使用LINQ

一、概念

  LINQ是一种微软公司提供的能直接引入到编程语言中的一种查询技术,可以通过编程语言自身来进行查询操作。

二、在程序中添加LINQ to SQL

  1、在项目上右键—添加—新建项—数据—选择“LINQ to SQL”:

  

  2、在设计界面中点击服务器资源管理器:

3、在数据连接上右键—添加连接:

4、选中数据库中的表,然后拖入设计视图中:

三、LINQ to SQL的八大子句

  1、from in子句:指定查询操作的数据源和范围变量

    在from子句中,如果数据源实现了IEnumerable<T>,那么编译器可以自动推断出范围变量的类型。:

          //第一步:实例化数据上下文对象
                DataStudentsDataContext db = new DataStudentsDataContext();

                //第二步:使用linq进行数据查询
                var result = from a in db.stuinfo
                             select a;//直接查询该对象
                //相当于 select * from stuinfo

                //使用查询到的结果进行数据展示
                this.GridView1.DataSource = result;
                this.GridView1.DataBind();

2、select子句:指定查询结果的类型和表现形式

  LINQ查询表达式中,select子句指定查询的类型和表现形式。LINQ查询表达式必须以select子句或group子句结束,否则会给出错误提示。

 

         //第一步:实例化数据上下文(DataContext)对象
                DataStudentsDataContext db = new DataStudentsDataContext();

                //第二步:使用Linq进行数据查询
                //var result = from stu in db.stuinfo
                //             select 
                //             new { 
                //             stu.stuid,
                //             stu.stuName,
                //             stu.stusex
                //             };
                //相当于:select stuid,stuName,stusex from stuinfo

                var result = from stu in db.stuinfo
                             select
                             new //创建匿名对象
                             {
                                 ID = stu.stuid, //设置对象中的属性
                                 Name = stu.stuName,
                                 Sex = stu.stusex,
                                 //ClassName=stu.classid==1?"智能1班":"智能2班"
                                 ClassName =GetClassName(stu.stuid) //调用方法为字段赋值
                             };
                //相当于:select ID=stuid,Name=stuName,Sex=stusex from stuinfo


                this.GridView1.DataSource = result;
                this.GridView1.DataBind();

3、where子句:筛选元素的逻辑条件,一般由逻辑运算符组成

  LINQ查询表达式中,where子句指定筛选元素的逻辑条件,一般由逻辑运算符组成,一个查询表达式可以不包含where子句,也可以包含1个或多个where子句。在where子句内,可以使用&&和||运算符来连接where子句中的多个布尔条件表达式。

对于一个LINQ查询表达式而言,where子句不是必需的。如果where子句在查询表达式中出现,那么where子句不能作为查询表达式的第一个子句或最后一个子句。

 //第一步:实例化数据上下文对象
                DataStudentsDataContext db = new DataStudentsDataContext();

                //第二步:执行查询
                //查询班里的男同学
                var result = from m in db.stuinfo
                             where m.stusex == ""
                             select m;

                Response.Write("班里的男同学有:<br/>");
                foreach (var man in result)
                {
                    Response.Write(man.stuName + "<br/>");
                }

                //查询班里名字第一个字是小的男同学
                var result2 = from p in db.stuinfo
                              where p.stusex == "" && p.stuName.StartsWith("")
                              select p;
                Response.Write("<hr/>班里名字第一个字是小的男同学有:<br>");
                foreach (var item in result2)
                {
                    Response.Write(item.stuName + "<br/>");
                }

4、group by子句:对查询进行分组

  在查询表达式中,group子句对查询的结果进行分组,并返回元素类型为IGrouping<TKey,TElemnt>的对象序列。

 

             //第一步:实例化数据上下文对象
                DataStudentsDataContext db = new DataStudentsDataContext();

                //第二步:用linq执行查询操作
                //根据性别对学生信息表进行分组
                var result = from stu in db.stuinfo
                             group stu by stu.stusex;
                    //group 分组对象  by  分组字段
                //查看分组后的元素
                foreach (var item in result)
                {
                    //得到分组的项
                    Response.Write(item.Key+"<br/>");//Key值指的是分组字段值
                    foreach (var stu in item)
                    {
                        //每个组中具体的元素(对象)
                        Response.Write(stu.stuName + "&nbsp;&nbsp;" + stu.stusex+"<br/>");
                    }
                }            

5、orderby子句:对查询结果进行排序,可以为“升序”或“降序”

  LINQ查询表达式中,orderby子句可以对查询结果进行排序。排序方式可以为“升序”或“降序”,且排序的键可以为一个或多个:

         DataStudentsDataContext db = new DataStudentsDataContext();

                //查询学生成绩按降序进行排列
                //var reslut = from s in db.exam
                //             orderby s.score descending
                //             select s;

                //查询学生成绩按降序进行排列,如果成绩一样,则按学号升序进行排列
                var reslut = from s in db.exam
                             orderby s.score descending,s.stuid ascending
                             select s;

                this.GridView1.DataSource = reslut;
                this.GridView1.DataBind();

6、join子句:连接多个查询操作的数据源

  LINQ查询表达式中,join子句比较复杂,它可以设置两个数据源之间的关系。当然,这两个数据源之间必须存在关联的属性或值。

  

         DataStudentsDataContext db = new DataStudentsDataContext();

                //查询学生姓名,性别,考试科目和成绩
                var i = from stu in db.stuinfo
                        join m in db.exam on stu.stuid equals m.stuid //注意:等于用equals表示
                        select
                        new
                        {
                            stu.stuName,
                            stu.stusex,
                            m.subject,
                            m.score
                        };
                //输出结果
                foreach (var res in i)
                {
                    Response.Write("姓名:" + res.stuName + ",性别:" + res.stusex + ",科目:" + res.subject + ",成绩" + res.score + "<br/>");

                }

  用Where实现多表查询   

                  //查询stu表中的全部字段,和Exam表中的科目和成绩字段

            var reslut = from stu in db.stuinfo from m in db.exam where stu.stuid == m.stuid select new { stu,//代表stu对象,对象里有stu的全部字段 m.subject, m.score }; //输出结果 foreach (var res in reslut) { //访问stu对象属性时,需要先从查询结果中找到stu对象,再找到stu对象的属性,如:res.stu.stuName Response.Write("姓名:" + res.stu.stuName + ",性别:" + res.stu.stusex + ",科目:" + res.subject + ",成绩" + res.score + "<br/>"); }

7、let子句:引入用于存储查询表达式中的子表达式结果的范围变量

  LINQ查询表达式中,let子句可以创建一个新的范围变量,并且使用该变量保存表达式中的结果。Let子句指定的范围变量的值只能通过初始化操作进行赋值,范围变量的值一旦被初始化,将不能再被改变。

  

 //第一步:实例化上下文对象
                DataStudentsDataContext db = new DataStudentsDataContext();

                //第二步:使用Linq语句查询结果 --查询名字第一个字为张,性别为男的同学
                var res = from i in db.stuinfo
                          let aa = i.stuName.StartsWith("") //将查询条件子表达式结果放入aa
                          where aa && i.stusex == ""
                          select i;

                //输出结果
                foreach (var stu in res)
                {
                    Response.Write("姓名:" + stu.stuName + ",性别:" + stu.stusex);
                }

  

8、into子句:提供一个临时标示符,充当对join、group或select子句的结果的引用  

    在LINQ查询表达式,into子句可以创建一个临时标识符,使用该标识符可以存储groupjoinselect子句的结果。

 DataStudentsDataContext db = new DataStudentsDataContext();

                var a = from m in db.stuinfo
                        group m by m.stusex into stu//将查询到的结果放到一个新的对象STU中
                        select stu;

                foreach (var item in a)
                {
                    Response.Write("班中的性别有:"+item.Key+"<br/>");
                    foreach (var stu in item)
                    {
                        Response.Write(stu.stuid + "&nbsp;&nbsp;" + stu.stuName + "&nbsp;&nbsp;" + stu.stusex + "<br/>");
                    }
                }

 ------------------------------------------------------------------------------------------------------

注意:VS2019如果没有安装linq组件,需要手动安装后使用

1、安装步骤:

  在工具中选择--》获取工具和功能

  如果有更新则更新:

  

更新中

更新后会弹出正在修改页面,选择单个组件,在搜索框中搜Linq

点击右下角的修改进行安装

 选择继续,等待安装

 最后出现这样的页面就安装好了,点击启动按钮启动应用程序:

在项目中添加新项,即可看到有Linq to SQL类了

from子句中,如果数据源实现了IEnumerable<T>,那么编译器可以自动推断出范围变量的类型。:

原文地址:https://www.cnblogs.com/JuneDream/p/14101809.html