SQL、LINQ、Lambda 三种用法
顏色注釋:?SQL?LinqToSql?Lambda?QA
1、?查詢Student表中的所有記錄的Sname、Ssex和Class列。
select?sname,ssex,class?from?student
Linq:
????from?s?in?Students
????select?new?{
????????s.SNAME,
????????s.SSEX,
????????s.CLASS
????}
Lambda:
????Students.Select(?s?=>?new?{
????????SNAME?=?s.SNAME,SSEX?=?s.SSEX,CLASS?=?s.CLASS
????})
2、?查詢教師所有的單位即不重復的Depart列。
select?distinct?depart?from?teacher
Linq:
????from?t?in?Teachers.Distinct()
????select?t.DEPART
Lambda:
????Teachers.Distinct().Select(?t?=>?t.DEPART)
3、?查詢Student表的所有記錄。
select?*?from?student
Linq:
????from?s?in?Students
????select?s
Lambda:
????Students.Select(?s?=>?s)
4、?查詢Score表中成績在60到80之間的所有記錄。
select?*?from?score?where?degree?between?60?and?80
Linq:
????from?s?in?Scores
????where?s.DEGREE?>=?60?&&?s.DEGREE?<?80
????select?s
Lambda:
????Scores.Where(?
????????s?=>?(
????????????????s.DEGREE?>=?60?&&?s.DEGREE?<?80?
?????????????)
????)
5、?查詢Score表中成績為85,86或88的記錄。
select?*?from?score?where?degree?in?(85,86,88)
Linq:
In
????from?s?in?Scores
????where?(
????????????new?decimal[]{85,86,88}
??????????).Contains(s.DEGREE)
????select?s
Lambda:
????Scores.Where(?s?=>?new?Decimal[]?{85,86,88}.Contains(s.DEGREE))
Not?in
????from?s?in?Scores
????where?!(
????????????new?decimal[]{85,86,88}
??????????).Contains(s.DEGREE)
????select?s
Lambda:
????Scores.Where(?s?=>?!(new?Decimal[]{85,86,88}.Contains(s.DEGREE)))
????Any()應用:雙表進行Any時,必須是主鍵為(String)
????CustomerDemographics?CustomerTypeID(String)
????CustomerCustomerDemos?(CustomerID?CustomerTypeID)?(String)
????一個主鍵與二個主建進行Any(或者是一對一關鍵進行Any)
????不可,以二個主鍵于與一個主鍵進行Any
????
????from?e?in?CustomerDemographics
????where?!e.CustomerCustomerDemos.Any()
????select?e
????
????from?c?in?Categories
????where?!c.Products.Any()
????select?c
6、?查詢Student表中"95031"班或性別為"女"的同學記錄。
select?*?from?student?where?class?='95031'?or?ssex=?N'女'
Linq:
????from?s?in?Students
????where?s.CLASS?==?"95031"?
???????||?s.CLASS?==?"女"
????select?s
Lambda:
????Students.Where(s?=>?(?s.CLASS?==?"95031"?||?s.CLASS?==?"女"))
7、?以Class降序查詢Student表的所有記錄。
select?*?from?student?order?by?Class?DESC
Linq:
????from?s?in?Students
????orderby?s.CLASS?descending
????select?s
Lambda:
????Students.OrderByDescending(s?=>?s.CLASS)
8、?以Cno升序、Degree降序查詢Score表的所有記錄。
select?*?from?score?order?by?Cno?ASC,Degree?DESC
Linq:(這里Cno?ASC在linq中要寫在最外面)
????from?s?in?Scores
????orderby?s.DEGREE?descending
????orderby?s.CNO?ascending?
????select?s
Lambda:
????Scores.OrderByDescending(?s?=>?s.DEGREE)
??????????.OrderBy(?s?=>?s.CNO)
9、?查詢"95031"班的學生人數。
select?count(*)?from?student?where?class?=?'95031'
Linq:
????(????from?s?in?Students
????????where?s.CLASS?==?"95031"
????????select?s
????).Count()
Lambda:
????Students.Where(?s?=>?s.CLASS?==?"95031"?)
????????????????.Select(?s?=>?s)
????????????????????.Count()
10、查詢Score表中的最高分的學生學號和課程號。
select?distinct?s.Sno,c.Cno?from?student?as?s,course?as?c?,score?as?sc?
where?s.sno=(select?sno?from?score?where?degree?=?(select?max(degree)?from?score))
and?c.cno?=?(select?cno?from?score?where?degree?=?(select?max(degree)?from?score))
Linq:
????(
????????from?s?in?Students
????????from?c?in?Courses
????????from?sc?in?Scores
????????let?maxDegree?=?(from?sss?in?Scores
????????????????????????select?sss.DEGREE
????????????????????????).Max()
????????let?sno?=?(from?ss?in?Scores
????????????????where?ss.DEGREE?==?maxDegree
????????????????select?ss.SNO).Single().ToString()
????????let?cno?=?(from?ssss?in?Scores
????????????????where?ssss.DEGREE?==?maxDegree
????????????????select?ssss.CNO).Single().ToString()
????????where?s.SNO?==?sno?&&?c.CNO?==?cno
????????select?new?{
????????????s.SNO,
????????????c.CNO
????????}
????).Distinct()
操作時問題?執行時報錯:?where?s.SNO?==?sno(這行報出來的)?運算符"=="無法應用于"string"和"System.Linq.IQueryable<string>"類型的操作數
解決:
原:let?sno?=?(from?ss?in?Scores
????????????????where?ss.DEGREE?==?maxDegree
????????????????select?ss.SNO).ToString()
Queryable().Single()返回序列的唯一元素;如果該序列并非恰好包含一個元素,則會引發異常。?
解:let?sno?=?(from?ss?in?Scores
????????????????where?ss.DEGREE?==?maxDegree
????????????????select?ss.SNO).Single().ToString()
11、查詢'3-105'號課程的平均分。
select?avg(degree)?from?score?where?cno?=?'3-105'
Linq:
????(
????????from?s?in?Scores
????????where?s.CNO?==?"3-105"
????????select?s.DEGREE
????).Average()
Lambda:
????Scores.Where(?s?=>?s.CNO?==?"3-105")
????????????.Select(?s?=>?s.DEGREE)
????????????????.Average()
12、查詢Score表中至少有5名學生選修的并以3開頭的課程的平均分數。
select?avg(degree)?from?score?where?cno?like?'3%'?group?by?Cno?having?count(*)>=5
Linq:
????????from?s?in?Scores
????????where?s.CNO.StartsWith("3")
????????group?s?by?s.CNO
????????into?cc
????????where?cc.Count()?>=?5
????????select?cc.Average(?c?=>?c.DEGREE)
Lambda:
????Scores.Where(?s?=>?s.CNO.StartsWith("3")?)
????????????.GroupBy(?s?=>?s.CNO?)
??????????????.Where(?cc?=>?(?cc.Count()?>=?5)?)
????????????????.Select(?cc?=>?cc.Average(?c?=>?c.DEGREE)?)
Linq:?SqlMethod
like也可以這樣寫:
????s.CNO.StartsWith("3")?or?SqlMethods.Like(s.CNO,"%3")
13、查詢最低分大于70,最高分小于90的Sno列。
select?sno?from?score?group?by?sno?having?min(degree)?>?70?and?max(degree)?<?90
Linq:
????from?s?in?Scores
????group?s?by?s.SNO
????into?ss
????where?ss.Min(cc?=>?cc.DEGREE)?>?70?&&?ss.Max(?cc?=>?cc.DEGREE)?<?90
????select?new
????{
????????sno?=?ss.Key
????}
Lambda:
????Scores.GroupBy?(s?=>?s.SNO)
???????????????.Where?(ss?=>?((ss.Min?(cc?=>?cc.DEGREE)?>?70)?&&?(ss.Max?(cc?=>?cc.DEGREE)?<?90)))
???????????????????.Select?(?ss?=>?new?{
????????????????????????????????????????sno?=?ss.Key
?????????????????????????????????????})
14、查詢所有學生的Sname、Cno和Degree列。
select?s.sname,sc.cno,sc.degree?from?student?as?s,score?as?sc?where?s.sno?=?sc.sno
Linq:
????from?s?in?Students
????join?sc?in?Scores
????on?s.SNO?equals?sc.SNO
????select?new
????{
????????s.SNAME,
????????sc.CNO,
????????sc.DEGREE
????}
Lambda:
????Students.Join(Scores,?s?=>?s.SNO,
??????????????????????????sc?=>?sc.SNO,?
??????????????????????????(s,sc)?=>?new{
??????????????????????????????????????????????SNAME?=?s.SNAME,
????????????????????????????????????????????CNO?=?sc.CNO,
????????????????????????????????????????????DEGREE?=?sc.DEGREE
??????????????????????????????????????????})
15、查詢所有學生的Sno、Cname和Degree列。
select?sc.sno,c.cname,sc.degree?from?course?as?c,score?as?sc?where?c.cno?=?sc.cno
Linq:
????from?c?in?Courses
????join?sc?in?Scores
????on?c.CNO?equals?sc.CNO
????select?new
????{
????????sc.SNO,c.CNAME,sc.DEGREE
????}
Lambda:
????Courses.Join?(?Scores,?c?=>?c.CNO,?
?????????????????????????????sc?=>?sc.CNO,?
?????????????????????????????(c,?sc)?=>?new?
????????????????????????????????????????{
????????????????????????????????????????????SNO?=?sc.SNO,?
????????????????????????????????????????????CNAME?=?c.CNAME,?
????????????????????????????????????????????DEGREE?=?sc.DEGREE
????????????????????????????????????????})
16、查詢所有學生的Sname、Cname和Degree列。
select?s.sname,c.cname,sc.degree?from?student?as?s,course?as?c,score?as?sc?where?s.sno?=?sc.sno?and?c.cno?=?sc.cno
Linq:
????from?s?in?Students
????from?c?in?Courses
????from?sc?in?Scores
????where?s.SNO?==?sc.SNO?&&?c.CNO?==?sc.CNO
????select?new?{?s.SNAME,c.CNAME,sc.DEGREE?}
轉載于:https://www.cnblogs.com/spring_wang/p/3605325.html
總結
以上是生活随笔為你收集整理的SQL、LINQ、Lambda 三种用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 中执行的 sql 注意字段之
- 下一篇: My SQL 学习笔记二