C#3.0 LINQ 查詢語法

發表于:2008-05-07來源:作者:點擊數: 標簽:
首先來看一個很簡單的linq查詢例子,查詢一個int 數組中小于5的數字,并按照大小順序排列: 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 s
首先來看一個很簡單的linq查詢例子,查詢一個int 數組中小于5的數字,并按照大小順序排列:
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(); } }
  上述代碼除了linq查詢語法外,其他都是我們所熟悉的語法,而linq查詢語法跟sql查詢語法很相識,除了先后順序。


  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(); }
  其中的 into 關鍵字表示 將前一個查詢的結果視為后續查詢的生成器,這里是跟 group by 一起使用的。

  linq中的group by不要跟 sql 中的group by 混淆,sql 由于是二維結構,group by 的一些邏輯受二維結構的約束,無法象 linq 中的group by 這么靈活。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97