linq的語法和案例

  本篇逐一介紹linq各個關鍵字的用法(from,select,group,into等),本篇全部的案例都是用linqpad來完成的(官方地址:http://www.linqpad.net/),建議想學好linq的博友們下載這個工具。sql

From

  查詢表達式是以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 子句用在查詢表達式中,用於指定將在查詢表達式中返回數據源中的哪些元素。 它將一個布爾條件(謂詞)應用於每一個源元素(由範圍變量引用),並返回知足指定條件的元素。 一個查詢表達式能夠包含多個 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用於生成要返回的結果,可作爲查詢表達式的結尾(必須以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來使用。

 

group

  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

相關文章
相關標籤/搜索