2013年9月3日 星期二

[轉貼] Linq初級學習(標準查詢操作符的使用和調用)


出處:http://www.cnblogs.com/huangcong/archive/2010/12/29/1919817.html

本文章是我最近學習Linq的一些示例,分享給和我一樣剛開始接觸Linq的朋友們作為一個參考,因為是初學,肯定有很多不足,因此希望大家友善提醒,切勿針鋒相對,我會及時改正的~~

目錄
01 投影操作符(Select,SelectMany)
02 限制操作符(Where)
03 排序操作符(OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse)
04 聯接操作符(join,GroupJoin)
05 分組操作符(GroupBy)
06 串聯操作符(Concat)
07 聚合操作符(Aggregate,Average,Count,LongCount,Max,Min,Sum)
08 集合操作符(Distinct,Union,Intersect,Except)
09 生成操作符(Empty,Range,Repeat)
10 轉換操作符(Cast,OfType,ToArray,ToDictionary,ToList,ToLookup)
11 元素操作符(DefaultIfEmpty,ElementAt,ElementAtOrDefault,First,Last,FirstOrDefault,LastOrDefault,Single,SingleOrDefault)
12 相等操作符(SequenceEqual)
13 量詞操作符(All,Any)
14 分割操作符(Skip,SkipWhile,Take,TakeWhile)

01.投影操作符(Select,SelectMany)

(1)Select操作符對單個序列或者集合中的值進行投影,可以控制從序列中返回指定的列.

方法語法:
代碼
查詢語法:
var query = from u in users select new { u.FirstName };
運行結果:

 (2)SelectMany操作符提供了將多個from子句組合起來的功能,它將每個對象的結果合並成單個序列.

代碼
運行結果:

02.限制操作符(Where)

(1)Where是限制操作符,可以對序列中的值進行過濾.Where操作符不啟動查詢的執行.但開始對對象進行迭代的時候才將過濾器應用到數據上.

方法語法:
代碼
查詢語法:
var query = from n in names where n.StartsWith("S") select n;
運行結果:

03 排序操作符(OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse)

(1)OrderBy/OrderByDescending操作符能將序列中的返回值按照升序/降序的順序進行排列.

方法語法:
代碼
查詢語法:
//正序 var query = from n in names orderby n select n; //倒 query = from n in names orderby n descending select n;
運行結果:

(2)ThenBy/ThenByDescending操作符可按照次關鍵對序列進行升序/降序排列.

方法語法:
代碼
查詢語法:
//正序 var query = from u in users orderby u.Name, u.Age select u; //倒序 query = (from u in users orderby u.Name select u).ThenByDescending(u => u.Age);
運行結果:

(3)Reverse操作符只是簡單的把數據源中的數據按照相反的順序返回.(需要注意的是:Reverse在LINQ To SQL中是不支持的).

代碼
運行結果:

04 聯接操作符(join,GroupJoin)

(1)join操作符類似於T-SQL中的inner join,它可以將一個數據源與另一個數據源想聯接,根據兩個數據源中相等的值進行匹配.

方法語法:
代碼
查詢語法:
var query = from r in roles join u in users on r.Id equals u.RoleId where r.Id == 1 select new { RoleId = r.Id, RoleName = r.Name, UserName = u.Name };
運行結果:

(2)GroupJoin操作符類似於T-SQL中的INNER JOIN, LEFT OUTER JOIN,返回的是一個層級的結果集

代碼
運行結果:

05 分組操作符(GroupBy)

(1)GroupBy分組操作符是根據一個指定的特定值將序列中的值或元素進行分組.

代碼
運行結果:

06 串聯操作符(Concat)

(1)Concat操作符可以將兩個對象聯接在一起

代碼
運行結果:

07 聚合操作符(Aggregate,Average,Count,LongCount,Max,Min,Sum)

(1)聚合函數是在序列上執行特定的運算後返回單個值.共有7個聚合查詢操作符:
  Aggregate:將序列中的值進行累積並返回結果.
    Average:計算一個數值序列的平均值.
    Count,LongCount:計算一個集合中元素的個數.但是前者返回的是Int32類型的值,後者為Int64
    Max,Min:分別是返回序列中的最大值和最小值
    Sum:返回集合中數值的總和

代碼
運行結果:

08 集合操作符(Distinct,Union,Intersect,Except)

(1)Distinct操作符可以刪除集合中重復的值,並返回該集合中不相同的元素.

代碼
運行結果:

(2)Union操作符可以取兩個集合的互不相同的所有數值.

代碼
運行結果:

(3)Intersect操作符可以返回兩個序列的交集.也就是返回同時存在於2個序列中的值.

代碼
運行結果:

(4)Except操作符可以返回兩個序列中不同的值.

代碼
運行結果:

09 生成操作符(Empty,Range,Repeat)

(1)Empty操作符可以返回一個指定類型的空集,通常用來作為聚合操作符的種子值.

代碼
運行結果:

(2)Range操作符可以創建一個連續數字序列的集合.

代碼
運行結果:

(3)Repeat操作符可以創建一個單值序列,可自定義重復的次數.

代碼
運行結果:

10 轉換操作符(Cast,OfType,ToArray,ToList,ToLookup)

(1)Cast操作符將查詢可以將IEnumerable中的元素轉換為指定的類型.

代碼
運行結果:

(2)OfType操作符可以對一個序列進行指定類型的過濾.

代碼
運行結果:

(3)ToArray/ToList操作符可以分別可以將序列創建為一個數組或者List<T>對象.需要注意的是進行轉換時會強制查詢立即執行,也就意味著查詢將於源數據斷開聯系.得到的序列為新創建的數組或List<T>.

代碼
運行結果:

(4)ToDictionary/ToLookUp可以將序列分別轉換為一對一的Dictionary<T Key,T Value>字典,或者一對多的LookUp<T Key,TElement Values>字典.

代碼
運行結果:

11 元素操作符(DefaultIfEmpty,ElementAt,ElementAtOrDefault,First,Last,FirstOrDefault,LastOrDefault,Single,SingleOrDefault)

(1)DefaultIfEmpty操作符將一個空集合替換為包含默認值的集合.

代碼
運行結果:

(2)ElementAt操作符返回集合中給定索引處的元素,如果索引超出范圍則會拋出一個index out of range的錯誤,如果不能確定索引范圍,應使用ElementAtOrDefault操作符,ElementAtOrDefault操作符會在索引超出范圍時返回一個默認值.

代碼
運行結果:

(3)First/Last操作符分別是返回集合中的第一個/最後一個元素,如果不確定是否有第一個或者最後一個值,可以使用FirstOrDefaule/LastOrDefault,它們分別會在First/Last操作符找不到元素的時候返回默認值.

代碼
運行結果:

(4)Single操作符可以從一個序列中返回唯一滿足某個特定條件的元素,如果找不到匹配的元素或者序列返回多個符合條件的元素,都會拋出異常.如果希望找不到元素時返回一個默認值,可以使用SingleOrDefault操作符.

代碼
運行結果:

12 相等操作符(SequenceEqual)

(1)SequenceEqual操作符可以判定兩個集合是否相等,返回值為Boolean值.

代碼
運行結果:

13 量詞操作符(All,Any)

(1)All操作符判斷集合中所有元素是否滿足特定的條件.如果均滿足返回True,否則False.

代碼
運行結果:

(2)Any操作符判斷集合中是否至少有一個元素滿足特定的條件.有則返回True,否則False.

代碼
運行結果:

14 分割操作符(Skip,SkipWhile,Take,TakeWhile)

(1)Skip操作符會跳過指定數量的元素後返回余下的元素,SkipWhile操作符則會通過特定的條件跳過一些元素,然後返回余下的元素.

代碼

運行結果:

(2)Take操作符會返回集合前面指定數量的元素,TakeWhile操作符則會通過特定的條件選取元素,如果某個元素不符合條件,則從該元素起的元素全部跳過.

代碼
運行結果:

小結

標准查詢操作符是LINQ查詢表達式的構成模塊,它們提供了許多查詢功能,目前我正在自學這些內容,在此把自己的學習成果分享一下,僅提供給初學者作為參考用,如果有錯誤的地方請高手指出,我盡快改正~~

相關文章

主要是提供給Linq初學者參考之用



沒有留言:

張貼留言