在學習C#時,不可避免的會碰到對資料的處理,本文章記錄筆者在學習LINQ對資料處理的方面曾有過的疑惑與後續的了解。
LINQ,全名為 Language Integrated Query
,發音為"link",顧名思義就是指擁有資料查詢能力的語言,是一種將查詢功能整合至以C#語言為基礎之技術的名稱。
主要有兩種查詢寫法:
查詢運算式是一種長得有點像SQL搜尋語法的運算式,範例如下:
from word in words select word.key;
標準查詢運算子,是應用於集合類型的運算子,提供了包括篩選、彙總、排序...等查詢功能,像是Select、Where、JOIN、OrderBy...等方法,範例如下:
words .Select(word => word.key)
這兩種是不是看起來有點像又有點不太一樣!
其實這兩種寫法,在經過Compiler編譯後,編譯出來的結果都是相同的! 所以可以依個人偏好選擇寫法。
下面舉個例子來說明一些細節:
var teenStudents = from s in studentList where s.Age > 12 && s.Age < 20 select new { StudentName = s.StudentName, Age = s.Age }; foreach (var student in teenStudents) { Console.WriteLine(student); }
從studentList的集合中,找到其中學生的年齡是介於12歲以及20歲之間的資料,並將學生的姓名以及年齡取出,之後進行輸出。
其中有一些特點:
var teenStudents // 宣告變數 = from s in studentList // 查詢運算式 where s.Age > 12 && s.Age < 20 select new { StudentName = s.StudentName, Age = s.Age }; // 利用匿名型別(Anonymous type)建立物件
而上面的查詢運算式程式碼,編譯後結果等同於下面這段標準查詢運算子程式碼:
var teenStudents = studentList .Where(s => (s.Age > 12 && s.Age < 20)) // Lambda表達式 (Lambda expression) .Select(x => new {x.StudentName, x.Age}); teenStudents.ToList().ForEach(s => Console.WriteLine(s));}) //Lambda Statement
可以看到有相當多可以探討的地方,例如 物件初始化、匿名型別,以及 LINQ 為什麼能對這些objects、entities 進行操作呢? 那是因為中間有 LINQ Providers 在幫我們做事情! 這些方法詳細的說明要期待後續的文章。
總結:LINQ是一種很強大的整理資料的方法,甚至有文章因為其便利性,用「少了LINQ幾乎不會寫程式」這種說法(笑)。
本篇大概說明LINQ的兩種寫法,因筆者在查詢資料時不太清楚為何會產生出這兩種寫法,他們的差異為何,因此在查詢相關文件後有點解惑,同時做了些整理。
參考資料:
維基百科:https://en.wikipedia.org/wiki/Language_Integrated_Query#Language_extensions
微軟官方文件:https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/linq/
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/linq/standard-query-operators-overview
https://docs.microsoft.com/zh-tw/dynamics365/fin-ops-core/dev-itpro/dev-tools/linq-provider-c