(九)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 + " " + 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子句可以创建一个临时标识符,使用该标识符可以存储group、join或select子句的结果。
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 + " " + stu.stuName + " " + stu.stusex + "<br/>"); } }
------------------------------------------------------------------------------------------------------
注意:VS2019如果没有安装linq组件,需要手动安装后使用
1、安装步骤:
在工具中选择--》获取工具和功能
如果有更新则更新:
更新中
更新后会弹出正在修改页面,选择单个组件,在搜索框中搜Linq
点击右下角的修改进行安装
选择继续,等待安装
最后出现这样的页面就安装好了,点击启动按钮启动应用程序:
在项目中添加新项,即可看到有Linq to SQL类了
在from子句中,如果数据源实现了IEnumerable<T>,那么编译器可以自动推断出范围变量的类型。: