1. 程式人生 > >LinQ 簡介

LinQ 簡介

expr 安全 predicate lambda lis fluent 針對 語言 方式

LinQ是3.0新加的語法。用起來比較方便,我們可以使用較簡單的方法來過濾數據和處理數據。

使用場景: 可以看到LINQ使用場景還是很多的。現在寫項目基本都會用到。

技術分享圖片

在出現委托之前,我們來查找對象

在C#2.0之前,我們必須使用“foreach”或“for”循環來遍歷集合來查找特定的對象例如,我們必須編寫下面的代碼來查找年齡在12歲到20歲之間(13到19歲的學生)的所有學生對象:

技術分享圖片

使用委托在C#2.0中查找集合中的元素
技術分享圖片

從C#3.0開始:

技術分享圖片

技術分享圖片

相比上面而言簡單了很多,這就是LINQ帶來的便捷。

LINQ的優點:

  • 熟悉的語言:開發人員不必為每種類型的數據源或數據格式學習新的查詢語言。
  • 編碼較少:與傳統方法相比,它減少了要編寫的代碼量。
  • 可讀代碼: LINQ使代碼更易讀,所以其他開發人員可以輕松理解和維護代碼。
  • 查詢多個數據源的標準化方式:可以使用相同的LINQ語法來查詢多個數據源。
  • 編譯查詢的時間安全性:在編譯時提供對象的類型檢查。
  • 智能感知支持: LINQ為通用集合提供智能感知。
  • 整形數據:您可以檢索不同形狀的數據。

LINQ API

LINQ只不過是實現IEnumerable和IQueryable接口的類的擴展方法的集合。

System.Linq命名空間包含LINQ必需的類和接口。EnumerableQueryable是包含擴展方法的兩個主要的LINQ API靜態類。

枚舉:

枚舉類包含實現IEnumerable <T>接口的類的擴展方法,這包括System.Collections.Generic名稱空間中的所有集合類型,如List <T>,Dictionary <T>,SortedList <T>,Queue <T> ,HashSet <T>,LinkedList <T>等

技術分享圖片

可查詢:

可查詢類包括用於實現類的擴展方法

的IQueryable <T>接口。IQueryable <T>用於針對數據類型已知的特定數據源提供查詢功能例如,實體框架api實現IQueryable <T>接口來支持像SQL Server這樣的底層數據庫的LINQ查詢。

所以對於繼承IEnumerable&Queryable的數據都可以使用LINQ。

要記住的要點:

  1. 使用System.Linq命名空間來使用LINQ。
  2. LINQ api包含兩個主要的靜態類EnumerableQueryable
  3. 靜態Enumerable類包含實現IEnumerable <T>接口的類的擴展方法。
  4. IEnumerable <T>類型的集合是內存中的集合,如List,Dictionary,SortedList,Queue,HashSet,LinkedList
  5. 靜態Queryable類包含實現IQueryable <T>接口的類的擴展方法
  6. 遠程查詢提供程序實現IQueryable <T>。例如。Linq to SQL,LINQ to DataSet,LINQ to XML,LINQ to Eneity等

LINQ查詢語法

向IEnumerable集合或IQueryable數據源寫入LINQ查詢有兩種基本方法。

  1. 查詢語法或查詢表達式語法
  2. 方法語法或方法擴展語法或Fluent

查詢語法:

技術分享圖片

要記住的要點:

  1. 如名稱所示,查詢語法與SQL(結構查詢語言)語法相同。
  2. 查詢語法以from子句開始,可以以SelectGroupBy子句結束
  3. 使用過濾,加入,分組,排序操作符等各種其他opertors來構建所需的結果。
  4. 隱式類型變量 - var可以用來保存LINQ查詢的結果。

LINQ方法語法與Lambda表達式

方法語法(也稱為流利語法)使用EnumerableQueryable靜態類中包含的擴展方法,類似於您將如何調用任何類的擴展方法。

方法語法一般都會配合Lambda表達式進行條件過濾

技術分享圖片

技術分享圖片

要記住的要點:

  1. Lambda表達式是表示匿名方法的一種較短的方式。
  2. Lambda表達式語法: parameters => body expression
  3. Lambda表達式可以有零參數。
  4. Lambda Expression可以在括號()中有多個參數。
  5. Lambda Expression可以在大括號{}中的正文表達式中包含多個語句
  6. 可以將Lambda表達式分配給Func,Action或Predicate委托。
  7. Lambda表達式可以以與委托類似的方式調用。

LinQ 簡介