SQL、LINQ和Lambda運算式

來源:互聯網
上載者:User


首先說說這三者完全是三種不同的東西,SQL是結構化查詢語言 (SQL)(Structured Query Language)簡稱,這大家再熟悉不過了,下面主要介紹LINQ和Lambda運算式的基本概念以及同一查詢這三者的不同實現。

簡單介紹

LINQ(Language Integrate Query)是Language-integrated Query (LINQ)他在對象和資料之間建立一種對應的關係,可以使用訪問記憶體對象的方式查詢資料集合。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 student3 Linq:4     from s in Students5     select s6 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 teacher3 Linq:4     from t in Teachers.Distinct()5     select t.DEPART6 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是結構化查詢語言 (SQL)(Structured Query Language)簡稱,這大家再熟悉不過了,下面主要介紹LINQ和Lambda運算式的基本概念以及同一查詢這三者的不同實現。

簡單介紹

LINQ(Language Integrate Query)是Language-integrated Query (LINQ)他在對象和資料之間建立一種對應的關係,可以使用訪問記憶體對象的方式查詢資料集合。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 student3 Linq:4     from s in Students5     select s6 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 teacher3 Linq:4     from t in Teachers.Distinct()5     select t.DEPART6 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運算式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.