LINQ的书写格式如下:
from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量中被查询的值 [group by 条件]Lambda表达式的书写格式如下:
(参数列表) => 表达式或者语句块
其中: 参数个数:可以有多个参数,一个参数,或者无参数。
参数类型:可以隐式或者显式定义。
表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。
1.查询全部1 查询Student表的所有记录。 2 select * from student 3 Linq: 4 from s in Students 5 select s 6 Lambda: 7 Students.Select( s => s)
2 按条件查询全部:
1 查询Student表中的所有记录的Sname、Ssex和Class列。 2 select sname,ssex,class from student 3 Linq: 4 from s in Students 5 select new { 6 s.SNAME, 7 s.SSEX, 8 s.CLASS 9 } 10 Lambda: 11 Students.Select( s => new { 12 SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS 13 })
3.distinct 去掉重复的
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
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
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 条件过滤
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.排序
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()行数查询
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()平均
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.子查询
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.分组 过滤
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.分组
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")
14. 多表查询
1 select sc.sno,c.cname,sc.degree from course as c,score as sc where c.cno = sc.cno 2 Linq: 3 from c in Courses 4 join sc in Scores 5 on c.CNO equals sc.CNO 6 select new 7 { 8 sc.SNO,c.CNAME,sc.DEGREE 9 } 10 Lambda: 11 Courses.Join ( Scores, c => c.CNO, 12 sc => sc.CNO, 13 (c, sc) => new 14 { 15 SNO = sc.SNO, 16 CNAME = c.CNAME, 17 DEGREE = sc.DEGREE 18 }) 19 .Average()
(在此,特别感谢网友“王者之舞”所提供的实例)