浅谈sql 、linq、lambda 查询语句的区别
LINQ的书写格式如下:
from 临时变量 in 集合对象或数据库对象
where 条件表达式
[order by条件]
select 临时变量中被查询的值
[group by 条件]
Lambda表达式的书写格式如下:
(参数列表) => 表达式或者语句块
其中: 参数个数:可以有多个参数,一个参数,或者无参数。
参数类型:可以隐式或者显式定义。
表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。
1.查询全部
实例 Code
查询Student表的所有记录。
1 select * from student 2 Linq: 3 from s in Students 4 select s 5 Lambda: 6 Students.Select( s => s)
2 按条件查询全部:
实例 Code
查询Student表中的所有记录的Sname、Ssex和Class列。
1 select sname,ssex,class from student 2 Linq: 3 from s in Students 4 select new { 5 s.SNAME, 6 s.SSEX, 7 s.CLASS 8 } 9 Lambda: 10 Students.Select( s =>new { 11 SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS 12 })
3.distinct 去掉重复的
实例 Code
查询教师所有的单位即不重复的Depart列。
select distinct depart from teacher Linq: from t in Teachers.Distinct() select t.DEPART Lambda: Teachers.Distinct().Select( t => t.DEPART)
4.连接查询 between and
实例 Code
查询Score表中成绩在60到80之间的所有记录。
1 select * from score where degree between 60 and 80 2 Linq: 3 from s in Scores 4 where s.DEGREE >=60&& s.DEGREE <80 5 select s 6 Lambda: 7 Scores.Where( 8 s => ( 9 s.DEGREE >=60&& s.DEGREE <80 10 ) 11 )
5.在范围内筛选 In
实例 Code
1 select * from score where degree in (85,86,88) 2 Linq: 3 from s in Scores 4 where ( 5 newdecimal[]{85,86,88} 6 ).Contains(s.DEGREE) 7 select s 8 Lambda: 9 Scores.Where( s =>new Decimal[] {85,86,88}.Contains(s.DEGREE))
6.or 条件过滤
实例 Code
查询Student表中"95031"班或性别为"女"的同学记录。
1 select * from student whereclass='95031' or ssex= N'女' 2 Linq: 3 from s in Students 4 where s.CLASS =="95031" 5 || s.CLASS =="女" 6 select s 7 Lambda: 8 Students.Where(s => ( s.CLASS =="95031"|| s.CLASS =="女"))
7.排序
实例 Code
以Class降序查询Student表的所有记录。
1 select * from student order by Class DESC 2 Linq: 3 from s in Students 4 orderby s.CLASS descending 5 select s 6 Lambda: 7 Students.OrderByDescending(s => s.CLASS)
8.count()行数查询
实例 Code
1 select count(*) from student whereclass='95031' 2 Linq: 3 ( from s in Students 4 where s.CLASS =="95031" 5 select s 6 ).Count() 7 Lambda: 8 Students.Where( s => s.CLASS =="95031" ) 9 .Select( s => s) 10 .Count()
10.avg()平均
实例 Code
查询'3-105'号课程的平均分。
1 select avg(degree) from score where cno ='3-105' 2 Linq: 3 ( 4 from s in Scores 5 where s.CNO =="3-105" 6 select s.DEGREE 7 ).Average() 8 Lambda: 9 Scores.Where( s => s.CNO =="3-105") 10 .Select( s => s.DEGREE)
11.子查询
实例 Code
查询Score表中的最高分的学生学号和课程号。
1 select distinct s.Sno,c.Cno from student as s,course as c ,score as sc 2 where s.sno=(select sno from score where degree = (select max(degree) from score)) 3 and c.cno = (select cno from score where degree = (select max(degree) from score)) 4 Linq: 5 ( 6 from s in Students 7 from c in Courses 8 from sc in Scores 9 let maxDegree = (from sss in Scores 10 select sss.DEGREE 11 ).Max() 12 let sno = (from ss in Scores 13 where ss.DEGREE == maxDegree 14 select ss.SNO).Single().ToString() 15 let cno = (from ssss in Scores 16 where ssss.DEGREE == maxDegree 17 select ssss.CNO).Single().ToString() 18 where s.SNO == sno && c.CNO == cno 19 select new { 20 s.SNO, 21 c.CNO 22 } 23 ).Distinct()
12.分组 过滤
实例 Code
查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select avg(degree) from score where cno like '3%' group by Cno having count(*)>=5 Linq: from s in Scores where s.CNO.StartsWith("3") group s by s.CNO into cc where cc.Count() >=5 select cc.Average( c => c.DEGREE) Lambda: Scores.Where( s => s.CNO.StartsWith("3") ) .GroupBy( s => s.CNO ) .Where( cc => ( cc.Count() >=5) ) .Select( cc => cc.Average( c => c.DEGREE) ) Linq: SqlMethod like也可以这样写: s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")
13.分组
实例 Code
查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select avg(degree) from score where cno like '3%' group by Cno having count(*)>=5 Linq: from s in Scores where s.CNO.StartsWith("3") group s by s.CNO into cc where cc.Count() >=5 select cc.Average( c => c.DEGREE) Lambda: Scores.Where( s => s.CNO.StartsWith("3") ) .GroupBy( s => s.CNO ) .Where( cc => ( cc.Count() >=5) ) .Select( cc => cc.Average( c => c.DEGREE) ) Linq: SqlMethod like也可以这样写: s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")
14. 多表查询
实例 Code
select sc.sno,c.cname,sc.degree from course as c,score as sc where c.cno = sc.cno Linq: from c in Courses join sc in Scores on c.CNO equals sc.CNO select new { sc.SNO,c.CNAME,sc.DEGREE } Lambda: Courses.Join ( Scores, c => c.CNO, sc => sc.CNO, (c, sc) =>new { SNO = sc.SNO, CNAME = c.CNAME, DEGREE = sc.DEGREE }) .Average()