上篇學習了Where操作,今天再來看看Select操作如何使用,和上篇一樣,本篇仍是以實例爲主來。
Select作用我們從字面意思就可以知道,就是查詢,和在SQL命令中的Select一樣,區別在於使用位置不同,Linq中的Select必須寫在語句的最後,而在SQL名字中select確是在開始處。
Select操作可以細分成9種使用形式,分別是簡單形式、匿名類型形式、條件形式、自定義類型形式、篩選形式、整形類型形式、嵌套類型形式、本地方法調用形式、Distinct形式。
1、簡單形式
例如:獲取所有學生的姓名
1
2
|
var
names = from student in db.Students select
student.Name |
在Linq中使用延遲加載來使我們覺得效率很高,其實,上面語句只是一個描述而已,並沒有真正的取出數據,只有當我們需要的時候Linq纔會幫我們把數據加載上。如果我們不想使用延遲加載那麼只需要調用ToList()或ToArray()方法即可。
2、匿名類型形式
匿名類型是C#3.0給我們帶來的新特性,本質上來說,它是編譯器對我們定義的臨時變量的一個匿名的存儲對象。匿名類型支持根據屬性來創建對象,例如:
var
obj = new {City= "北京" }; |
編譯器會幫助我們創建一個包含屬性City的匿名類,當然我們通過Type類來幫助我們知道這個匿名類型的名字是什麼,但是,這個名字對我們來說沒有任何意義。
那麼接下來我們舉例說明匿名類型形式:
1
2
3
4
5
|
var
query = from student in db.Students select
new { Name
= student.FirstName + "
" +
student.LastName, Age
= student.Age }; |
上面的例子中我們創建了一個包含Name和Age屬性的匿名類,屬性Name由student的FisrtName和LastName拼接而成,Age就是student的Age。
3、條件形式
條件形式就是在匿名類型的基礎上加上了條件表達式來進行查詢,例如
1
2
3
4
5
|
var
query = from student in db.Students select
new { Name
= student.FirstName + "
" +
student.LastName, Grade
= student.Score > 90 ? "A" :
"B" }; |
4、自定義類型形式
顧名思義,自定義類型形式就是使用我們自己定義的數據類型作爲查詢結果的方式,例如:
1
2
3
4
5
|
var
query = from student in db.Students select
new Name{ FirstName
= student.FirstName, LastName
= student.LastName };
|
在上面的查詢中我們使用了自己定義的Name類型,它包含FirstName和LastName兩個屬性。
5、篩選形式
篩選形式就用到了我們上篇中介紹的Where操作,在上篇中我們已經舉過Where操作相關的例子了,這裏就不再舉例了。
6、整形類型形式
原文作者將這種類型稱爲shaped形式,我不是特別理解,但是看完之後發現這種形式只是在匿名類型形式之上的一種擴展,就是將匿名類型的屬性也做成匿名類型的,這樣我們就得到了shaped形式。
例如:
1
2
3
4
5
|
var
query = from student in db.Student select
new { Name=student.FirstName
+ "
" +
student.LastName, Address=
new {student.Road,student.City,student.Country} }; |
7、嵌套類型形式
使用嵌套類型我們可以得到的結果集合中的每個對象又包含一個結果集合。主要是用在主從表的情況下。
例如:
1
2
3
4
5
6
7
|
var
query = from student in db.Students select
new {
student.Name, Contacts
= from contact in db.ContactDetails where
contact.SId = student.SId select
contact }; |
8、本地方法調用形式
這種形式就是在select語句中調用本地方法。這個形式我就直接使用原作者的舉例了。
例如:在查詢中調用本地方法PhoneNumberConverter將電話號碼轉換成國際格式。
1
2
3
4
5
6
7
8
9
|
var
q = from c in db.Customers where
c.Country == "UK" ||
c.Country == "USA" select
new { c.CustomerID, c.CompanyName, Phone
= c.Phone, InternationalPhone
= PhoneNumberConverter(c.Country, c.Phone) }; |
PhoneNumberConverter方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public string PhoneNumberConverter( string Country,
string Phone) { Phone
= Phone.Replace( "
" , "" ).Replace( ")" , ")-" ); switch (Country) { case "USA" : return "1-" +
Phone; case "UK" : return "44-" +
Phone; default : return Phone; }
} |
9、Distinct形式
該形式是用來篩選不重複的結果集,類似於在SQL命令中使用Select Distinct。
例如:
1
2
3
4
|
var
query = ( from
student in db.Students select
student.Age ).Distinct(); |
上面的查詢等同於下面的SQL語句
1
|
SELECT
DISTINCT Age FROM Students; |
總結,今天學習了Select操作,理解了Select的不同形式的使用,對我有很大的幫助,同時我查到一個能夠幫助我們進行Linq和SQL語句轉換的工具——Linqer(Linqer Download)。大家可以下載使用,這樣就可以更加了解Linq與SQL直接的聯繫。