Lambda linq 区别

来源:互联网 发布:ab测试 算法 编辑:程序博客网 时间:2024/06/16 11:57


http://www.cnblogs.com/kongxiaoshuang/p/5952514.html


  LINQ的书写格式如下:  
 from 临时变量 in 集合对象或数据库对象  
 where 条件表达式   
[order by条件]   
select 临时变量中被查询的值  
 [group by 条件]

Lambda表达式的书写格式如下:

(参数列表) => 表达式或者语句块

其中: 参数个数:可以有多个参数,一个参数,或者无参数。

参数类型:可以隐式或者显式定义。

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

 1.查询全部

复制代码
实例 Code 查询Student表的所有记录。select * from studentLinq:    from s in Students    select sLambda:    Students.Select( s => s)
复制代码

2 按条件查询全部:

复制代码
 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from studentLinq:    from s in Students    select new {        s.SNAME,        s.SSEX,        s.CLASS    }Lambda:    Students.Select( s => new {        SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS    })
复制代码

3.distinct 去掉重复的

复制代码
查询教师所有的单位即不重复的Depart列。select distinct depart from teacherLinq:    from t in Teachers.Distinct()    select t.DEPARTLambda:    Teachers.Distinct().Select( t => t.DEPART)
复制代码

4.连接查询 between and

复制代码
查询Score表中成绩在60到80之间的所有记录。select * from score where degree between 60 and 80Linq:    from s in Scores    where s.DEGREE >= 60 && s.DEGREE < 80    select sLambda:    Scores.Where(        s => (                s.DEGREE >= 60 && s.DEGREE < 80             )    )
复制代码

5.在范围内筛选 In

复制代码
select * from score where degree in (85,86,88)Linq:    from s in Scores    where (            new decimal[]{85,86,88}          ).Contains(s.DEGREE)    select sLambda:    Scores.Where( s => new Decimal[] {85,86,88}.Contains(s.DEGREE))
复制代码

6.or 条件过滤

复制代码
查询Student表中"95031"班或性别为"女"的同学记录。select * from student where class ='95031' or ssex= N''Linq:    from s in Students    where s.CLASS == "95031"       || s.CLASS == "女"    select sLambda:    Students.Where(s => ( s.CLASS == "95031" || s.CLASS == "女"))
复制代码

7.排序

复制代码
以Class降序查询Student表的所有记录。select * from student order by Class DESCLinq:    from s in Students    orderby s.CLASS descending    select sLambda:    Students.OrderByDescending(s => s.CLASS)
复制代码

8.count()行数查询

复制代码
select count(*) from student where class = '95031'Linq:    (    from s in Students        where s.CLASS == "95031"        select s    ).Count()Lambda:    Students.Where( s => s.CLASS == "95031" )                .Select( s => s)                    .Count()
复制代码

10.avg()平均

复制代码
查询'3-105'号课程的平均分。select avg(degree) from score where cno = '3-105'Linq:    (        from s in Scores        where s.CNO == "3-105"        select s.DEGREE    ).Average()Lambda:    Scores.Where( s => s.CNO == "3-105")            .Select( s => s.DEGREE)
复制代码

11.子查询

复制代码
查询Score表中的最高分的学生学号和课程号。select distinct s.Sno,c.Cno from student as s,course as c ,score as scwhere s.sno=(select sno from score where degree = (select max(degree) from score))and c.cno = (select cno from score where degree = (select max(degree) from score))Linq:    (        from s in Students        from c in Courses        from sc in Scores        let maxDegree = (from sss in Scores                        select sss.DEGREE                        ).Max()        let sno = (from ss in Scores                where ss.DEGREE == maxDegree                select ss.SNO).Single().ToString()        let cno = (from ssss in Scores                where ssss.DEGREE == maxDegree                select ssss.CNO).Single().ToString()        where s.SNO == sno && c.CNO == cno        select new {            s.SNO,            c.CNO        }    ).Distinct()
复制代码

12.分组 过滤

复制代码
查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。select avg(degree) from score where cno like '3%' group by Cno having count(*)>=5Linq:        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: SqlMethodlike也可以这样写:    s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")
复制代码

13.分组

复制代码
查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。select avg(degree) from score where cno like '3%' group by Cno having count(*)>=5Linq:        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: SqlMethodlike也可以这样写:    s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")
复制代码

14. 多表查询

复制代码
select sc.sno,c.cname,sc.degree from course as c,score as sc where c.cno = sc.cnoLinq:    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()
复制代码