SQL, 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 표준 쿼리 연산자를 구현합니다. 전달, 탐색, 정렬, 쿼리, 조인, 합계, 최대값, 최소값 및 기타 작업과 같은 작업이 포함됩니다.
람다 식은 실제로 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 })
※고유 중복제거 조회
查询教师所有的单位即不重复的Depart列。 2 select distinct depart from teacher 3 Linq: 4 from t in Teachers.Distinct() 5 select t.DEPART6 Lambda: 7 Teachers.Distinct().Select( t => t.DEPART)
※2개의 조회 간격 내
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()
위 내용은 제가 정보를 참고하여 작성한 일부 편집 및 요약입니다. 부족한 점이 있으면 비판하고 정정해 주세요!
우선 전혀 다른 세 가지에 대해 이야기해보겠습니다. 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()
以上就是SQL、LINQ和Lambda表达式的内容,更多相关内容请关注PHP中文网(www.php.cn)!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

C++에는 Lambda 표현식을 사용하여 예외를 처리하는 두 가지 방법이 있습니다. 즉, try-catch 블록을 사용하여 예외를 포착하고, catch 블록에서 예외를 처리하거나 다시 발생시킵니다. std::function 유형의 래퍼 함수를 사용하면 try_emplace 메서드가 Lambda 표현식에서 예외를 포착할 수 있습니다.

C++ 다중 스레드 프로그래밍에서 람다 식의 장점에는 단순성, 유연성, 매개 변수 전달 용이성 및 병렬성이 포함됩니다. 실제 사례: 람다 식을 사용하여 다중 스레드를 만들고 다른 스레드에서 스레드 ID를 인쇄하여 이 방법의 단순성과 사용 용이성을 보여줍니다.

C++에서 클로저는 외부 변수에 액세스할 수 있는 람다 식입니다. 클로저를 생성하려면 람다 표현식에서 외부 변수를 캡처하세요. 클로저는 재사용성, 정보 숨기기, 지연 평가와 같은 이점을 제공합니다. 이는 클로저가 외부 변수가 파괴되더라도 여전히 접근할 수 있는 이벤트 핸들러와 같은 실제 상황에서 유용합니다.

C++ Lambda 표현식은 함수 범위 변수를 저장하고 함수에 액세스할 수 있도록 하는 클로저를 지원합니다. 구문은 [캡처 목록](매개변수)->return-type{function-body}입니다. 캡처 목록은 캡처할 변수를 정의합니다. [=]를 사용하여 모든 지역 변수를 값으로 캡처하고, [&]를 사용하여 모든 지역 변수를 참조로 캡처하거나, [변수1, 변수2,...]를 사용하여 특정 변수를 캡처할 수 있습니다. 람다 표현식은 캡처된 변수에만 액세스할 수 있지만 원래 값을 수정할 수는 없습니다.

C++에서는 Lambda 표현식을 함수 매개 변수로 사용하여 콜백 함수의 유연성을 얻을 수 있습니다. 구체적으로 설명하면 다음과 같습니다. 매개변수 전달: std::function을 통해 Lambda 표현식을 래핑하고 이를 함수 포인터 형식으로 함수에 전달합니다. 반환 값 처리: std::function을 사용하여 콜백 함수 포인터를 선언할 때 반환 값 유형을 지정합니다. 실제 사례: GUI 이벤트 처리에서 콜백을 최적화하고, 불필요한 객체나 함수 포인터 생성을 방지하고, 코드 단순성과 유지 관리성을 향상시킵니다.

C++에서 외부 변수의 람다 식을 캡처하는 방법에는 세 가지가 있습니다. 값으로 캡처: 변수의 복사본을 만듭니다. 참조로 캡처: 변수 참조를 가져옵니다. 값 및 참조로 동시에 캡처: 값 또는 참조로 여러 변수를 캡처할 수 있습니다.

C++ 람다 표현식을 사용하여 지연 평가를 수행하는 방법은 무엇입니까? 지연 평가 함수 개체를 만들려면 람다 식을 사용하세요. 지연된 계산은 필요할 때까지 실행을 연기합니다. 필요한 경우에만 결과를 계산하여 성능을 향상시킵니다.

함수 포인터를 람다 식으로 바꾸면 가독성이 향상되고 상용구 코드가 줄어들며 재사용성이 높아집니다. 특히 람다 식은 [capturelist](parameterlist)->returntype{body} 구문을 사용하며, 코드 단순성과 유지 관리성을 향상시키기 위해 벡터 정렬과 같은 실제 사례에 사용할 수 있습니다.
