• (九)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>,那么编译器可以自动推断出范围变量的类型。:

  • 相关阅读:
    弱监督学习框架下的图像语义分割调研
    LeetCode(115):不同的子序列
    LeetCode(114): 二叉树展开为链表
    LeetCode(113):路径总和 II
    项目实战10.1—企业级自动化运维工具应用实战-ansible
    快收藏!高手Linux运维管理必备工具大全,你会吗?
    项目实战12.2—企业级监控工具应用实战-zabbix操作进阶
    项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
    项目实战13—企业级虚拟化Virtualization
    计算机专用英语词汇1695个词汇表
  • 原文地址:https://www.cnblogs.com/JuneDream/p/14101809.html
Copyright © 2020-2023  润新知