.NET Framework本身支援LINQ查詢的對象有三種:LINQ to SQL, LINQ to XML和LINQ to object。
舉個例子,我有一個資料庫grade裝有全校學生的各科成績,我想列出男生數學不及格的人,LINQ就應該這樣寫(in C#):
var results = from record in grades where record.Math < 60 && record.Male Select record.Name |
傳回來的results是一個很像陣列的東西,在.NET Framework裡面叫 IEnumerable ,但是只能用foreach做資料存取,沒有index的功能。
如果知道傳回值的型別,就直接用 IEnumerable<T> 把傳回值接回來,不要用var。
IEnumerable<string> results = grades.Where(record => record.Math < 60 && record.Male) .Select(record => record.Name); |
=> 這個怪怪的東西是內嵌函數(lambda expression,.NET Framework 3.0 and above)的符號,lambda expression可以想做是匿名函數,符號左邊是參數,右邊則是函數本體,必須有傳回值,如果是單行程式,計算結果就是傳回值。
LINQ有一個必須要注意的地方:程式並不在該行執行查詢 ,.NET Framework會等到results這個變數被使用(例如讀取)的時候才去查results是啥 ,也就是說,如果在results被使用之前,資料來源grades有變動,results的結果就會反映這些變動而和在該行執行查詢的結果不同,這是為了效率所做的考量,如果要在該行執行查詢,只要把results轉成一個List或其他資料結構就行了。我一開始用的時候沒注意到,後來除錯搞好久。
也是<結果的內容> 並不是在該行執行時就算好了,有點像 該變數 關聯了一段程式碼,使用該變數才會執行該行程式碼
沒有留言:
張貼留言