玩轉C#之【LINQ 基本介紹】

閱讀時間約 11 分鐘

介紹

LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。
大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一文字的這種感覺。
📷

歷史演進

C#1.0 1.1 時代 委派的做法
public class LambdaShow
{
public delegate void NoReturnNoPara();//定義一個委派
public delegate void NoReturnWthPara(int x,int y);//定義一個帶參數委派

public voui Show()
{
NoReturnNoPara method = new NoReturnNoPara(this.Donothing);//實體化一個委派
}

private void DoNothing()
{
Console.WriteLine("Test");
}
}
C# 2.0 時代 匿名方法
  • 除了可以少起方法名稱之外
  • 還可以讀取出K值
public voui Show()
{
int k =1;
NoReturnNoPara method = new NoReturnNoPara(delegate ()
{
Console.WriteLine(k);
Console.WriteLine("Test");
});
}
C# 3.0 時代 lambda
  • "=>" 稱之為goes to
  • 左邊是參數列表,右邊是方法體,本質是一個方法
public voui Show()
{
NoReturnNoPara method = new NoReturnNoPara( () =>
{
Console.WriteLine("Test");
});
}
//帶參數
public voui Show()
{
NoReturnWthPara method = new NoReturnWthPara( (int x,int y) =>
{
Console.WriteLine("Test");
});
}
//也可以省略參數型別
public voui Show()
{
NoReturnWthPara method = new NoReturnWthPara( (x,y) =>
{
Console.WriteLine("Test");
});
}
//如果方法體只有一行 可以去掉{} 跟;
public voui Show()
{
NoReturnWthPara method = new NoReturnWthPara( (x,y) => Console.WriteLine("Test"));
}
//new NoReturnWthPara() 也可以省略掉
public voui Show()
{
NoReturnWthPara method = (x,y) => Console.WriteLine("Test");
}
lambda表達式 是個什麼呢?
  • 首先不是委派,委派是類型
  • 也不是委派的實例 因為這裡是省略new 委派()
  • 只是一個方法(作用是一個方法) => 不完全正確
  • 編譯之後實際上是一個類中類,裡面的一個internal 方法,然後被綁定到靜態的委派類型
透過IL反編譯一下
📷

匿名類 var 擴展方法

普通的類別
Student student = new Student()
{
Id =1,
Name = "大禹治水",
Age = 25,
ClassId= 2
};
student.Study();
匿名類別 C#3.0
object model = new
{
Id = 2,
Name ="小帥哥",
Age =25,
ClassId= 2
};
Console.WriteLine(model.Id);//不能直接讀取Id 編譯器不允許通過
解決方式:
第一種
動態類型 C#4.0 =>可以避開編譯器檢查
dynamic dModel =new
{
Id = 2,
Name ="小帥哥",
Age =25,
ClassId= 2
};
Console.WriteLine(dModel.Id);
dModel.Id =3;
第二種
用var C#3.0
實際上編譯後有一個真實的類別,從反編譯工具可以看出只有Get方法所以不能Set
var dModel =new
{
Id = 2,
Name ="小帥哥",
Age =25,
ClassId= 2
};
Console.WriteLine(dModel.Id);
dModel.Id =3;//不能執行 因為只能Get 不能Set
📷
IL反編譯一下
📷
第三種
反射可以找到
var =>是一個語法糖,由編譯器自動推算類型
var =>宣告的時候就確定類型
var i1 =1;
var s="123";
s=123;//宣告的時候就確定類型
擴充方法 C#3.0
Student student = new Student()
{
Id =1,
Name = "大禹治水",
Age = 25,
ClassId= 2
};
student.Study();
我們希望學生能有一個唱歌的功能,但不希望修改原本的類別,但是又要增加方法
首先要是一個靜態類別,裡面的一個靜態方法
public static class ExtenedMethod
{
public static void Sing(Student student)
{
Console.WriteLine($"{student.Name} sing a Song");
}
}
正常情況下使用方式
ExtendMethod.Sing(student);
如果我們在第一個參數前面加上一個this
public static class ExtenedMethod
{
public static void Sing(this Student student)
{
Console.WriteLine($"{student.Name} sing a Song");
}
}
可以變成這樣
student.Sing();
擴充方法就是在靜態類別,裡面的一個靜態方法,第一個參數前面加上一個this
用途:可以不修改類,增加方法也就是改變寫法方便了一點
缺點:優先調用類型的方法(有隱患),
擴充父類型,導致任何子類別都有這個方法,而且還有可能被覆蓋,最好指定類型擴充

Linq to object

一般情況過濾數據
var list = new List<Student>();
foreach(var item in studentList)
{
if(item.Age < 30)
{
list.Add(item);
}
}
等價的做法
public static class ExtendMethod
{
public static List<Student>EleventWhere(this Kust<Student> source,Func<Student,bool> func)
{
var list = new List<Student>();
foreach(var item in source)
{
if(func.Invoke(item))
{
list.Add(item);
}
}

}
}
var result = list.EleventWhere(x=>x.Age < 30);//陳述式語法

yield 跌代器

  1. 基於委派封裝解構,去掉重複代碼
  2. 泛型,應對個總類型情況
  3. 加上跌代器,延遲獲取
public static IEnumberable<T> ElevenWhere<T>(this IEnumberable<T> source,Func<T,bool> func)
{
foreach(var item in source)
{
if(func.Invoke(item))
{
yield return item;
}
}
}

linq常用方法介紹

Where =>篩選
Select=>轉換
Min/Max/OrderBy/
Linq To Object(Enumerable)
Linq To Sql(Queryable) =>SQL+ADO.NET 表達式目錄樹解析SQL
📷
下一章節會正式介紹LINQ的語法

參考資料

本篇已同步發表至個人部落格
https://moushih.com/2022ithome13/
我的鐵人賽文章
https://ithelp.ithome.com.tw/articles/10289873
為什麼會看到廣告
8會員
39Content count
我是這個部落格的作者,喜歡分享有關投資 💰、軟體開發 💻、占卜 🔮 和虛擬貨幣 🚀 的知識和經驗。
留言0
查看全部
發表第一個留言支持創作者!
一代軍師 的其他內容
介紹 序列化、反序列化概念: 📷 關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解 使用方式 測試資料 SerializableAttribute 微軟說明文件 二進位序列化 雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
介紹 反射:System.Reflection .Net框架提供的Library,可以讀取並使用metadata Dll-IL-Metadata-反射 透過VS編譯器 編譯成dll/exe 點擊exe的時候,他有一個依賴的環境叫做CLR IL:可以透過ILSpy(反編譯工具) 📷 一般情況
介紹 在C#2.0時代以前,是沒有泛型的,所以當我們遇到需求是方法內做相同的事情,但因為輸入或輸出的型別不一樣,我們就必須重複寫出類似的程式 以下的例子是=>不同的輸入型別 但卻做相同的事情 =>印出輸入資料 範例: 輸入參數:int或string或DateTime 功能:印出輸入的"數值"
介紹 序列化、反序列化概念: 📷 關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解 使用方式 測試資料 SerializableAttribute 微軟說明文件 二進位序列化 雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
介紹 反射:System.Reflection .Net框架提供的Library,可以讀取並使用metadata Dll-IL-Metadata-反射 透過VS編譯器 編譯成dll/exe 點擊exe的時候,他有一個依賴的環境叫做CLR IL:可以透過ILSpy(反編譯工具) 📷 一般情況
介紹 在C#2.0時代以前,是沒有泛型的,所以當我們遇到需求是方法內做相同的事情,但因為輸入或輸出的型別不一樣,我們就必須重複寫出類似的程式 以下的例子是=>不同的輸入型別 但卻做相同的事情 =>印出輸入資料 範例: 輸入參數:int或string或DateTime 功能:印出輸入的"數值"
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
Token Extension的主角之一 Transfer Fee 目前官方釋出的代幣擴充功能總共 14 項,其中又以 Transfer fee 這個擴充為最多人使用。Transfer fee 嚴格規範了每筆轉帳交易的手續費,讓代幣的發行者擁有更好手續費來源,同時也保障 NFT 創作者的版稅收益。
Thumbnail
今年一月正式推出的 Solana 上的新標準 Token Extension,重塑了之前 Solana 所使用的 token 協議,替 Solana的鏈上資產解放更多潛力。資產之間的交互將變得更靈活,除了讓帳戶之間的轉帳更有保障之外,也在 Defi 未來的結構性商品上產生了更多的想像空間。
Thumbnail
《玩轉腦朋友2》刪除角色1:Shame 羞恥 在《玩轉腦朋友》的開發過程中,「羞恥」原本是27種情緒之一,最初設計為男性角色。但在續集中,「羞恥」被重新塑造成女性角色,預計成為新的情緒角色。然而,導演認為「羞恥」會讓萊莉的成長故事過於沉重和黑暗,因此將這種情緒融合進「阿焦」的性格中,成為「我不夠
Thumbnail
這是一篇關於名古屋旅遊的文章,介紹了從機場到市區、不同景點的遊玩體驗,特別適合親子自由行。
Thumbnail
通路創新和創意結合,帶來了許多令人驚喜的商業案例。從Amazon Go的無人商店到UBEREAT機器人送餐,不同品牌都在用新科技改變生活方式。本文分享了幾個成功的通路創新案例,絕對能啟發你的Idea!
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
暢銷懸疑小說的《法庭遊戲》改編為電影版,日前也在台灣上映,燒腦的情節加上法庭的諜對諜攻防;再加上永瀨廉、杉咲花、北村匠海三位高人氣演員加持。
Thumbnail
自2020年問世以來,日本潮流品牌Water The Plant便以其獨特的設計理念和色彩豐富的產品系列,在全球潮流文化中掀起了一股正能量的旋風。
Thumbnail
戴姆勒克萊斯勒出產的後輪驅動雙門跑車 Chrysler Crossfire(火線),使用 33% 賓士 SLK 跑車零件,在 2003 年推出,於 2007 年因為公司重組後停產。雖然,1:1 的新車買不起,那買台 1:18 的模型車來玩玩總是可以的。😜
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
Token Extension的主角之一 Transfer Fee 目前官方釋出的代幣擴充功能總共 14 項,其中又以 Transfer fee 這個擴充為最多人使用。Transfer fee 嚴格規範了每筆轉帳交易的手續費,讓代幣的發行者擁有更好手續費來源,同時也保障 NFT 創作者的版稅收益。
Thumbnail
今年一月正式推出的 Solana 上的新標準 Token Extension,重塑了之前 Solana 所使用的 token 協議,替 Solana的鏈上資產解放更多潛力。資產之間的交互將變得更靈活,除了讓帳戶之間的轉帳更有保障之外,也在 Defi 未來的結構性商品上產生了更多的想像空間。
Thumbnail
《玩轉腦朋友2》刪除角色1:Shame 羞恥 在《玩轉腦朋友》的開發過程中,「羞恥」原本是27種情緒之一,最初設計為男性角色。但在續集中,「羞恥」被重新塑造成女性角色,預計成為新的情緒角色。然而,導演認為「羞恥」會讓萊莉的成長故事過於沉重和黑暗,因此將這種情緒融合進「阿焦」的性格中,成為「我不夠
Thumbnail
這是一篇關於名古屋旅遊的文章,介紹了從機場到市區、不同景點的遊玩體驗,特別適合親子自由行。
Thumbnail
通路創新和創意結合,帶來了許多令人驚喜的商業案例。從Amazon Go的無人商店到UBEREAT機器人送餐,不同品牌都在用新科技改變生活方式。本文分享了幾個成功的通路創新案例,絕對能啟發你的Idea!
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
暢銷懸疑小說的《法庭遊戲》改編為電影版,日前也在台灣上映,燒腦的情節加上法庭的諜對諜攻防;再加上永瀨廉、杉咲花、北村匠海三位高人氣演員加持。
Thumbnail
自2020年問世以來,日本潮流品牌Water The Plant便以其獨特的設計理念和色彩豐富的產品系列,在全球潮流文化中掀起了一股正能量的旋風。
Thumbnail
戴姆勒克萊斯勒出產的後輪驅動雙門跑車 Chrysler Crossfire(火線),使用 33% 賓士 SLK 跑車零件,在 2003 年推出,於 2007 年因為公司重組後停產。雖然,1:1 的新車買不起,那買台 1:18 的模型車來玩玩總是可以的。😜