本篇逐一介紹linq各個關鍵字的用法(from,select,group,into等),本篇全部的案例都是用linqpad來完成的(官方地址:http://www.linqpad.net/),建議想學好linq的博友們下載這個工具。sql
查詢表達式是以from開頭的(之因此不延用sql的語法以'select'開頭,是爲了配合vs的智能語法提示)。api
單個from工具
代碼spa
var query = from a in new string[]{"a","b","c"} select a; foreach(var item in query){ Console.WriteLine(item); }
結果.net
多個from子句執行聯接3d
多個from時,會對兩個數據源作笛卡爾積,簡單一點說,有A和B兩個表,分別有x和y條記錄,A和B的笛卡爾積會求出x*y條記錄,即每個A表裏的一條記錄對應了B表裏的y條記錄。可實現join語法相同的操做。code
示例一:對象
代碼blog
var query = from a in new string[]{"a","b","c"} from b in new int[]{1,2,3} select new{A=a,B=b}; foreach(var item in query){ Console.WriteLine(item.A+" "+item.B); }
結果排序
固然,能夠再對上面的笛卡爾積作where的條件篩選操做,這樣就會求出本身想要的記錄。
複合from子句
上一個示例只是簡單的多個from的聯接,若是下一個from子句的數據源和上一個from對象有聯繫時,就要用到複合from子句,但語法是同樣的
代碼
from a in new List<(string name,string[] scores)>{ {("張三",new string[]{"80","90"})}, {("李四",new string[]{"30","40"})} } from b in a.scores select new {a,b}
結果的結構
where
子句用在查詢表達式中,用於指定將在查詢表達式中返回數據源中的哪些元素。 它將一個布爾條件(謂詞)應用於每一個源元素(由範圍變量引用),並返回知足指定條件的元素。 一個查詢表達式能夠包含多個 where
子句,一個子句能夠包含多個謂詞子表達式
以下面的兩個查詢表達式是同樣的
from a in new int[]{1,2,3,4,5} where a>1 && a<4 select a from a in new int[]{1,2,3,4,5} where a>1 where a<4 select a
select用於生成要返回的結果,可作爲查詢表達式的結尾(必須以select或是group結尾)。
返回結果爲舊類型
可參考from一節裏的「單個from」案例,select語法沒有new關鍵字,以以前的類型爲返回
返回結果爲新類型
可參考from一節裏的「多個from」案例,select語法後跟了new關鍵字,會以new的匿名類型作爲新的返回類型。下面將代碼稍作改動,變於查看每一個結果記錄的結構。
代碼:
var query = from a in new string[]{"a","b","c"} from b in new int[]{1,2,3} select new{FieldOfA=a,FieldOfB=b}; foreach(var item in query){ //Console.WriteLine(item.A+" "+item.B); Console.WriteLine(item); }
結果
有升序:orderby,thenby
降序:OrderByDescending,ThenByDescending
var list=new List<string[]>{ new string[3]{"學校1","1年級","班級1"}, new string[3]{"學校1","1年級","班級2"}, new string[3]{"學校1","2年級","班級1"}, new string[3]{"學校1","2年級","班級2"}, new string[3]{"學校2","1年級","班級1"}, new string[3]{"學校2","1年級","班級2"}, new string[3]{"學校2","2年級","班級1"}, new string[3]{"學校2","2年級","班級2"} }; var query1=list.OrderBy(a=>a[0]).ThenByDescending(a=>a[1]).ThenBy(a=>a[2]).Select(a=>a); var query2 = from a in list orderby a[0],a[1] descending,a[2] select a; foreach(var item in query1){ Console.WriteLine($"{item[0]}--{item[1]}--{item[2]}"); } foreach(var item in query2){ Console.WriteLine($"{item[0]}--{item[1]}--{item[2]}"); }
的查詢表達式裏只有orderby,配合descending來使用。
1))語法上:能夠以group做爲查詢表達式的結尾(如from a in tab_a group a by a.xxx),但若是group後跟了into,必須繼續編寫該查詢,並最終使用一個select
語句或另外一個 group
子句結束該查詢
2)返回的類型:返回一個 IGrouping<TKey,TElement> 對象序列,TKey的類型爲by關鍵字後面的類型,TElement的類型爲group關鍵字後面的類型
3)分組鍵的類型:組鍵能夠是任何類型,如字符串、內置數值類型、用戶定義的命名類型或匿名類型。分組鍵即by關鍵字後的對象
以單個鍵爲分組鍵
示例
from a in new List<string>{"aa","aa","ab","ab","ba","ba","bb","bb"} group a by a[0]
以組合鍵爲分組鍵
示例
from a in new List<string>{"aa1","aa2","ab1","ab2"} group a by new{first=a[0],second=a[1]}
以布爾值爲分組鍵
示例
from a in new List<string>{"a","ab","abc","abcd"} group a by a.Length>2
返回類型裏的元素類型
group返回的類型爲 IGrouping<TKey,TElement>,TKey的類型由by關鍵字後面的類型決定;而TElement的類型則於group關鍵字後面的類型決定。
示例1
from a in new List<string>{"aa1","aa2","ab1","ab2"} group new{firstChar=a[0],secondChar=a[1],thirdChar=a[2] } by new{first=a[0],second=a[1]}
示例二
from a in new List<string>{"張三","李四"} join b in new List<string[]>{ new string[]{"張三","英語","60"}, new string[]{"張三","語文","70"}, new string[]{"李四","英語","90"}, new string[]{"李四","語文","80"}, } on a equals b[0] group new {姓名=a,學科=b[1],成績=b[2]} by a