class program { static void main(string[] args) { int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 }; var m = from n in arr where n < 5 orderby n select n; foreach (var n in m) { console.writeline(n); } console.readline(); } }
q:為何 linq 查詢語法是以 from 關鍵字開頭的,而不是以 select 關鍵字開頭的?select 開頭這種寫法跟sql的寫法更接近,更易懂呀?
a:簡單來說,為了ide的智能感知(intelisence)這個功能,select 關鍵字放在后面了。
編程語言以 select 開頭寫linq查詢語法不是沒出現過,你如果使用過2005年的vb9 ctp 版本,那時候vb9的linq查詢語法就是 select 關鍵字在前面,但是 select 關鍵字在前面,在做智能感知(intelisence)時候就很頭大。經過微軟ide組的權衡,確定了把 from 關鍵字放在最前面。
比如:你看 http://blog.joycode.com/saucer/archive/2005/09/16/63513.aspx 這篇博客,那時候 vb9 linq的查詢語法還是 select 參數在最前面。不過后來 vb9 測試版改成了跟 c# 一樣的做法, from 關鍵字放在最前面了。
假設你要書寫這樣的代碼:select p.name, p.age from p in persons where xxx ,代碼是一個個字符輸入的。
我們在寫到 p in persons 之前,p 的類型是無法推測的,所以寫 select p. 的時候,name之類的屬性不會彈出智能提示來。
這樣就需要先去寫 from 這句,再回來寫 select。
微軟ide組經過反復考慮決定,還不如就把 select 寫到后面了。于是編程語言中的寫法就確定這樣來寫了。
我們再來看一個稍稍復雜的linq查詢:
在我們羅列的語言字符串中,我們希望按照字符長短,分類羅列出來,實現代碼如下:
static void main(string[] args) { string [] languages = {"java","c#","c++","delphi","vb.net","vc.net","c++ builder","kylix","perl","python"}; var query = from item in languages orderby item group item by item.length into lengthgroups orderby lengthgroups.key descending select lengthgroups; foreach (var item in query) { console.writeline("strings of length {0}",item.key); foreach (var val in item) { console.writeline(val); } } console.readline(); }
linq中的group by不要跟 sql 中的group by 混淆,sql 由于是二維結構,group by 的一些邏輯受二維結構的約束,無法象 linq 中的group by 這么靈活。
1
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/