出來工做學習的愈來愈多了,對C#也是理解愈來愈深,老是想找個時間總結一下本身學過的東西,文字記錄,常常翻看,查缺補漏的讓本身不至於變得善忘,遂就有了此係列,權當複習鞏固之用。html
無論咱們進行什麼項目的開發,跟數據打交道絕對是繞不過去的,有了數據,咱們不免要去操做數據,大量的數據給咱們帶來了操做的麻煩,.net爲了解決這個問題,在 .NET Framework 3.5 版中引入的一項創新功能,它在對象領域和數據領域之間架起了一座橋樑,它就是LINQ(Language Integrated Quary)。git
在 C# 中可爲如下對象編寫 LINQ 查詢:SQL Server 數據庫、XML 文檔、ADO.NET 數據集以及支持 IEnumerable 或泛型 IEnumerable
此方法將序列中的每一個元素投影到新表單。
例:sql
此方法基於謂詞篩選值序列。
咱們能夠對數據進行篩選數據庫
var query = table.where(x => x.name == "Tom");
同時也提供了按序號進行篩選,index從0開始markdown
var query = table.where((x, index)=> index >= start && index <= end);
與Where()相似,但不一樣的是First()只會返回知足條件的第一個序列元素,如果元素不存在時,First()會拋出異常,FirstOrDefault()則是會返回元素的默認值。
Last()、LastOrDefault()與First()、FirstOrDefault()正好相反,它們返回序列中符合條 件的最後一個元素,如果元素不存在時,Last()會拋出異常,LastOrDefault()則是會返回元素的默認值框架
int[] array = {1, 2, 3, 4}; int item = array.First(x=>x%2 == 0);//2 int item = array.FirstOrDefault(x=>x == 5);//0 int item = array.Last();//4 int item = array.LastOrDefault();//4
Single()與First()相似。可是Single()要求序列中有且只有一個知足條件的項,不然拋出異常,SingleOrDefault()在無知足條件項時,返回默認值。函數
int[] array = {1, 2}; int item = array.Single();//拋出異常
大都數人一看到這個詞就知道他的用法,Distinct()用於提出序列中重複的數據,並返回其他的全部數據。如:學習
int[] array = {2,2,3,3,4,4,5,5}; var query = array.Distinct();//[2,3,4,5]
Cast用於將非泛型序列轉換爲泛型序列 IEnumerable
ArrayList list = new ArrayList(); list.Add(1); list.Add("二"); var query=list.Cast<int>();//異常: System.InvalidCastException: 指定的轉換無效
跟在sql中做用一致,GroupBy()就是用做分組的。
GroupBy()返回了一個IEnumerable<IGrouping<TKey,TSource>>的藉口類型,咱們查看接口可知,這個,IGrouping<TKey,TSource>也是一個序列,只是多了一個Key屬性,而且依據 Key進行了分組。
Intersect()返回兩個序列中相同元素構成的序列,如:
int[] array1 = { 2,3,4,5}; int[] array2 = {2,3,6,7}; var query = array1.Intersect(array2);//2,3
Except(),則是返回第一個序列中有而第二個序列中沒有的數據,如:
int[] array1 = { 2,3,4,5}; int[] array2 = {2,3,6,7}; var query = array1.Except(array2);//4,5
OrderyBy與OrderByDescending()很好理解,一個是升序一個是降序排列。如:
var query = table.OrderBy(x=>x.time);//對時間進行升序排列 var queryDesc = table.OrderByDescending(x=>x.time);//對時間進行降序排列
那麼ThenBy()與ThenByDescending是幹嗎用的呢?當咱們須要一個較爲複雜的排序,先按時間進行排序,再按名字進行排序,那麼咱們此時就要用到這兩個方法了。由於ThenBy()是在IOrderedEnumerable
Take()方法返回原序列中的前N個元素構成的新序列,如:
var query = table.Take(3);//取前3個元素
TakeWhile()會取出連續知足條件的數據,直到遇到第一個不知足的數據。
Skip()則是跳過前N個元素,如:
var query = table.Skip(3);//跳過前三個返回後面的數據
SkipWhile() 會一直跳過連續知足條件的數據,直到遇到第一個不知足的數據就返回該元素以後的全部元素構成的序列。
Take()與Skip()這兩個運算符在Linq to sql 中經常使用做分頁。如:
var query = table.Skip(10).Take(10);//每頁10條數據,顯示第二頁數據
Zip()對兩個序列中位置相同的兩個元素進行操做,基於兩個元素的操做結果返回一個新 的元素。若是兩個序列的長度不相等,則以長度短的爲準。如:
int[] array1 = { 1, 2, 3, 4, 5 }; string[] array2 = { "星期一", "星期二", "星期三" }; var query = array1.Zip(array2, (x,y) => String.Format("{0},{1}", x, y)); 返回結果爲: 1,星期一 2,星期二 ,星期三
Concat()運算符用於鏈接兩個序列。如:
int[] array1 = { 3, 1, 2 }; int[] array2 = { 2, 3, 5 }; var query = array1.Concat(array2);// 3,1,2,2,3,5
Union()運算符也用於鏈接兩個序列,可是會剔除相同的項目。如:
int[] array1 = { 3, 1, 2 }; int[] array2 = { 2, 3, 5 }; var query = array1.Union(array2);// 3,1,2,5
Contains()判斷某一個元素是否存在於序列中,Any()則是判斷序列中是否存在知足表達式的元素,二者返回的都是bool,知足則返回true。
Linq在咱們須要操做數據的代碼中應用頻繁,它具備延遲加載的概念,只有在數據上調用聚合函數時纔會執行查詢操做,對咱們不少操做都提供了極大地便利。學好Linq在EF等ORM框架中也能更快速的開發。 本文借鑑了張子陽老師的《net之美》第五章LINQ的部份內容,在此表示感謝。