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

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

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

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

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

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

C++ 람다 표현식 최적화를 위한 성능 팁은 다음과 같습니다. 불필요한 람다 객체 생성 방지 std::bind를 통해 가장 작은 객체를 명시적으로 캡처 std::move를 사용하여 캡처된 변수를 이동하여 복사 방지 람다 본문을 최적화하여 불필요한 메모리 할당, 반복 계산 및 전역 변수 액세스
