SQL、LINQ和Lambda表达式

首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询这三者的不同实现。

简单介绍

LINQ(Language Integrate Query)是语言集成查询他在对象和数据之间建立一种对应的关系,可以使用访问内存对象的方式查询数据集合。LINQ查询是C#中的一种语言构造。因此开发人员可以再C#代码汇总嵌套类似于SQL语句的查询表达式,从而实现数据查询的功能。LINQ也不是简单地作为C#中嵌套查询表达式,而是将查询表达式作为C#的一种语法。
在.NET类库中,LINQ相关类库都在System.Linq命名空间下,该命名空间提供支持使用LINQ进行查询的类和接口,其中最主要的是以下两个类和两个接口。
※IEnumerable接口:它表示可以查询的数据集合,一个查询通常是逐个对集合中的元素进行筛选操作,返回一个新的IEnumerable接口,用来保存查询结果。
※IQueryable接口:他继承IEnumerable接口,表示一个可以查询的表达式目录树。
※Enumerable类:它通过对IEnumerable提供扩展方法,实现LINQ标准查询运算符。包括过路、导航、排序、查询、联接、求和、求最大值、求最小值等操作。
※Queryable类:它通过对IQueryable提供扩展方法,实现LINQ标准查询运算符。包括过路、导航、排序、查询、联接、求和、求最大值、求最小值等操作。
Lambda表达式实际上是一个匿名函数,它可以说是对LINQ的补充。由于LINQ查询关键字和IEnumerable接口的方法之间有一个对应关系,但是LINQ查询表达式中可以使用的查询功能很少。在实际开发中通过查询结果或数据源进行方法调用,从而进行更多的查询操作。由于Lambda表达式是匿名函数,它可以赋值到一个委托,而在IEnumerable接口的方法中很多通过函数委托来实现自定义运算、条件等操作,所以Lambda表达式在LINQ中被广泛使用。

对比实现

※查询全部内容

1 查询Student表的所有记录。
2 select * from student
3 Linq:
4     from s in Students
5     select s
6 Lambda:
7     Students.Select( s => s) 

※按列查询

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     })

※distinct去重查询

 查询教师所有的单位即不重复的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) 

※两个区间内查询

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     )

※在一个范围内查询

 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))

※或关系查询

 查询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 == "女")) 

※排序

 以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)

※行数查询

 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()

※平均值查询

 查询'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)

※潜逃查询

查询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()

※分组

 查询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") 

※分组过滤

查询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") 

※多表联合查询

 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() 

以上内容是本人查阅资料做的一些整理和总结,有不足之处请大家批评指正!

时间: 2024-10-17 23:16:44

SQL、LINQ和Lambda表达式的相关文章

SQL 转化LINQ 或 lambda表达式

问题描述 SQL转化LINQ或lambda表达式SELECTb.*FROM(SELECTappli_no,max(revision_no)ASrevision_noFROMTBAARS_COMMITTEE_APPLICATIONGROUPBYappli_no)aINNERJOINTBAARS_COMMITTEE_APPLICATIONbON(a.appli_no=b.appli_noANDa.revision_no=b.revision_no) 解决方案 解决方案二:varquery=fromx

Linq之Lambda表达式初步认识

目录 写在前面 匿名方法 一个例子 Lambda 定义 一个例子 总结 参考文章 写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说Lambda与匿名方法的知识点.也算是对知识点的查漏补缺吧,也许你会说这没啥大不了的,项目中都在用,但是有些知识,你回头在查看的时候,总会有那么点不一样的收获,这点我是感同身受的,我看书有个习惯,一本书,我能看个三四遍,每次总会有收获.当然,你可以说,当时肯定没认真看,不是那样子的,我认为最直接的原

Linq之Lambda进阶

目录 写在前面 系列文章 带有标准查询运算符的Lambda Lambda中类型推断 Lambda表达式中变量作用域 异步Lambda 总结 写在前面 上篇文章介绍了Lambda的基本概念以及匿名方法,本篇继续介绍Lambda的一些内容,既然学了,就要总结的全面一点. 系列文章 Linq之Lambda表达式初步认识 带有标准查询运算符的Lambda 什么事标准查询运算符? "标准查询运算符"是组成语言集成查询 (LINQ) 模式的方法. 大多数这些方法都在序列上运行,其中的序列是一个对象

为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数

Codeusing System;using System.Collections.Generic;using System.Linq;using System.Text; using System.Diagnostics; namespace ConsoleApplication1{    static class Program    {        static void Main(string[] args)        {            //Predicate       

Linq Lambda表达式全面分析

在向大家详细介绍Linq Lambda表达式之前,首先让大家了解下expr是什么样的东西,然后全面介绍 Linq Lambda表达式. 介绍Linq Lambda表达式之前,先看一个例子: Expression<Func<string, bool>> expr = o => o.Length > 10; 初次接触Linq Lambda表达式的人可能会被搞迷糊,这样的语句到底是什么意思,怎么样工作,原理又 是什么. 逐级分析以上语句,分为两个部分,以等号为界. 第一部分是

Linq Lambda表达式详细介绍

C#3.0有很多值得学习的地方,这里我们主要介绍Linq查询,包括介绍Linq Lambda表达式等方面. C#3.0时代的Linq查询语句 在C#3.0中我们又有了改善代码的新工具. 匿名委托很不错,但是我们希望有更简单的,更容易维护的代码.C#3.0提供了Linq Lambda表达式的 概念,你可以把Linq Lambda表达式是我们应用匿名委托的捷径,下面是用Linq Lambda表达式重写的查询 : static IEnumerable<Employee> GoldWatch(IEnu

Lambda表达式和linq普通语法的一些对比

  linq普通语法 return (from p in dc.TeacherBasicInformation where p.TeacherNum == num select p.PhotoSrc).FirstOrDefault();             Lambda表达式 return dc.TeacherBasicInformation.Where(p => p.TeacherNum == num).Select(p => p.PhotoSrc).FirstOrDefault();

请看一个大神写的lambda表达式,不用linq请问怎么调用

问题描述 请看一个大神写的lambda表达式,不用linq请问怎么调用 Func<int, bool> MyAnd(Func<int, bool> f1, Func<int, bool> f2) { return x => f1(x) && f2(x); } 解决方案 直接调用也可以: bool b1 = MyAnd(x => x < 10, x => x % 2 == 0)(4); bool b2 = MyAnd(x =>

数据库是sql server,现有两张表,用lambda表达式做一个查询

问题描述 数据库是sql server,现有两张表,用lambda表达式做一个查询 表t1有7个字段,包括id,code:表t2有5个字段,包括id: 现在要查询:t2上id与t1上的id相同且code为3的t1上的所有字段. 解决方案 var query = from x in t1 join y in t2 on x.id equals y.id where x.code == 3 select new { x, y };