EF中的三种linq、lambda、sql查询方式

sql 、linq、lambda 查询语句的区别

转:https://blog.youkuaiyun.com/weixin_39550799/article/details/78918301
LINQ的书写格式如下:
from 临时变量 in 集合对象或数据库对象
where 条件表达式
[order by条件]
select 临时变量中被查询的值
[group by 条件]

Lambda表达式的书写格式如下:
(参数列表) => 表达式或者语句块
其中:参数个数:可以有多个参数,一个参数,或者无参数。
参数类型:可以隐式或者显式定义。

表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。

1.查询全部

[sql] view plain copy

  1. 查询Student表的所有记录。

  2. select * from student

  3. Linq:

  4.  from s in Students  
    
  5.  select s  
    
  6. Lambda:

  7.  Students.Select( s => s)  
    

2 按条件查询全部:

查询Student表中的所有记录的Sname、Ssex和Class列。

select sname,ssex,class from student

[sql] view plain copy

  1. Linq:

  2.  from s in Students  
    
  3.  select new {  
    
  4.      s.SNAME,  
    
  5.      s.SSEX,  
    
  6.      s.CLASS  
    
  7.  }  
    
  8. Lambda:

  9.  Students.Select( s => new {  
    
  10.      SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS  
    
  11.  })  
    

3.distinct 去掉重复的

[sql] view plain copy

  1. 查询教师所有的单位即不重复的Depart列。

  2. select distinct depart from teacher

  3. Linq:

  4.  from t in Teachers.Distinct()  
    
  5.  select t.DEPART  
    
  6. Lambda:

  7.  Teachers.Distinct().Select( t => t.DEPART)  
    

4.连接查询 between and

[sql] view plain copy

  1. 查询Score表中成绩在60到80之间的所有记录。

  2. select * from score where degree between 60 and 80

  3. Linq:

  4.  from s in Scores  
    
  5.  where s.DEGREE >= 60 && s.DEGREE < 80  
    
  6.  select s  
    
  7. Lambda:

  8.  Scores.Where(  
    
  9.      s => (  
    
  10.              s.DEGREE >= 60 && s.DEGREE < 80  
    
  11.           )  
    
  12.  )  
    

5.在范围内筛选 In

[sql] view plain copy

  1. select * from score where degree in (85,86,88)

  2. Linq:

  3.  from s in Scores  
    
  4.  where (  
    
  5.          new decimal[]{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 条件过滤

[sql] view plain copy

  1. 查询Student表中"95031"班或性别为"女"的同学记录。

  2. select * from student where class =‘95031’ or ssex= N’女’

  3. Linq:

  4.  from s in Students  
    
  5.  where s.CLASS == "95031"  
    
  6.     || s.CLASS == "女"  
    
  7.  select s  
    
  8. Lambda:

  9.  Students.Where(s => ( s.CLASS == "95031" || s.CLASS == "女"))  
    

7.排序

[sql] view plain copy

  1. 以Class降序查询Student表的所有记录。

  2. select * from student order by Class DESC

  3. Linq:

  4.  from s in Students  
    
  5.  orderby s.CLASS descending  
    
  6.  select s  
    
  7. Lambda:

  8.  Students.OrderByDescending(s => s.CLASS)  
    

8.count()行数查询

[sql] view plain copy

  1. select count(*) from student where class = ‘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()平均

[sql] view plain copy

  1. 查询’3-105’号课程的平均分。

  2. select avg(degree) from score where cno = ‘3-105’

  3. Linq:

  4.  (  
    
  5.      from s in Scores  
    
  6.      where s.CNO == "3-105"  
    
  7.      select s.DEGREE  
    
  8.  ).Average()  
    
  9. Lambda:

  10.  Scores.Where( s => s.CNO == "3-105")  
    
  11.          .Select( s => s.DEGREE)  
    

11.子查询

[sql] view plain copy

  1. 查询Score表中的最高分的学生学号和课程号。

  2. select distinct s.Sno,c.Cno from student as s,course as c ,score as sc

  3. where s.sno=(select sno from score where degree = (select max(degree) from score))

  4. and c.cno = (select cno from score where degree = (select max(degree) from score))

  5. Linq:

  6.  (  
    
  7.      from s in Students  
    
  8.      from c in Courses  
    
  9.      from sc in Scores  
    
  10.      let maxDegree = (from sss in Scores  
    
  11.                      select sss.DEGREE  
    
  12.                      ).Max()  
    
  13.      let sno = (from ss in Scores  
    
  14.              where ss.DEGREE == maxDegree  
    
  15.              select ss.SNO).Single().ToString()  
    
  16.      let cno = (from ssss in Scores  
    
  17.              where ssss.DEGREE == maxDegree  
    
  18.              select ssss.CNO).Single().ToString()  
    
  19.      where s.SNO == sno && c.CNO == cno  
    
  20.      select new {  
    
  21.          s.SNO,  
    
  22.          c.CNO  
    
  23.      }  
    
  24.  ).Distinct()  
    

12.分组过滤

[sql] view plain copy

  1. 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

  2. select avg(degree) from score where cno like ‘3%’ group by Cno having count(*)>=5

  3. Linq:

  4.      from s in Scores  
    
  5.      where s.CNO.StartsWith("3")  
    
  6.      group s by s.CNO  
    
  7.      into cc  
    
  8.      where cc.Count() >= 5  
    
  9.      select cc.Average( c => c.DEGREE)  
    
  10. Lambda:

  11.  Scores.Where( s => s.CNO.StartsWith("3") )  
    
  12.          .GroupBy( s => s.CNO )  
    
  13.            .Where( cc => ( cc.Count() >= 5) )  
    
  14.              .Select( cc => cc.Average( c => c.DEGREE) )  
    
  15. Linq: SqlMethod

  16. like也可以这样写:

  17.  s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")  
    

13.分组

[sql] view plain copy

  1. 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

  2. select avg(degree) from score where cno like ‘3%’ group by Cno having count(*)>=5

  3. Linq:

  4.      from s in Scores  
    
  5.      where s.CNO.StartsWith("3")  
    
  6.      group s by s.CNO  
    
  7.      into cc  
    
  8.      where cc.Count() >= 5  
    
  9.      select cc.Average( c => c.DEGREE)  
    
  10. Lambda:

  11.  Scores.Where( s => s.CNO.StartsWith("3") )  
    
  12.          .GroupBy( s => s.CNO )  
    
  13.            .Where( cc => ( cc.Count() >= 5) )  
    
  14.              .Select( cc => cc.Average( c => c.DEGREE) )  
    
  15. Linq: SqlMethod

  16. like也可以这样写:

  17.  s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")  
    
  18. 多表查询

[sql] view plain copy

  1. Linq:

  2.  from c in Courses  
    
  3.  join sc in Scores  
    
  4.  on c.CNO equals sc.CNO  
    
  5.  select new  
    
  6.  {  
    
  7.      sc.SNO,c.CNAME,sc.DEGREE  
    
  8.  }  
    
  9. Lambda:

  10.  Courses.Join ( Scores, c => c.CNO,  
    
  11.                           sc => sc.CNO,  
    
  12.                           (c, sc) => new  
    
  13.                                      {  
    
  14.                                          SNO = sc.SNO,  
    
  15.                                          CNAME = c.CNAME,  
    
  16.                                          DEGREE = sc.DEGREE  
    
  17.                                      })  
    
  18.              .Average()  
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值