Charlie Chen (陳慶裕)
5 min readAug 7, 2018

LINQ 深入淺出(一):觀念篇

教學傳送門《Language-Integrated Query 快速上手》,保哥的課程內容很扎實,請多多支持好課程!

語言整合查詢(英語:Language Integrated Query,縮寫:LINQ)音”link”

說到早期微軟的開發人員,想要存取資料庫,都是運用ADO.NET來進行資料CRUD,而它也是在Web Form時期造成台灣的專案公司頗為熱宗使用的開發方式,因為進入門檻低,就能做到簡單、快速開發出網站,這也是打下一大基礎的技術,即便ASP.NET MVC已經出現10年左右,目前為止,還是有很多公司都是用此一開發框架(Web Form)進行專案開發!

ADO.NET和Web Form原本應該是完美的搭配,然而此架構下也並非無缺點,正好它的缺點也是相當的致命,就是PostBack讓資料存取後顯示在頁面上的結果,常常會有落差,為了解決這樣的問題,是要消耗更大的成本進行處理。

而在這時候LINQ (C# 3.0^)和ASP.NET MVC就此誕生,微軟新的架構就是要來解決控制項效能和PostBack問題,但是相對而言,門檻也提高了,但過了那個關卡就通了!

另外,值得一提的是LINQ也是基於ADO.NET之上所開發的架構,所以使用LINQ其實底層也是運用到ADO.NET的技術。

LINQ主要特性:強型別、延遲執行、函式語言特性、平行處理…等。簡單說可以針對基於IEnumerable底層下的任何陣列、集合做資料查詢。

保哥:LINQ改變了資料處理方式,更改變了我們解決問題的思考方式!

LINQ目前提供者有Linq to Object、Linq to SQL、Linq to XML、Linq to DataSet、Linq to Entities

泛型與LINQ命名空間:
若想要學好LINQ,以下三個MSDN可建議看:

System.Collections.Generic
System.Linq
System.Linq.Expressions

其中Linq.Expressions的MSDN解釋命名空間包含類別、 介面和列舉,可讓語言層級程式碼運算式表示為運算式樹狀架構的表單中的物件。這算是LINQ提供者都會實作到的類別,但也相對很抽象,所以可以多花點時間了解!

( 資料結構,如串列 (List)HashTable (C# 下的 Dicationay)堆疊 (Stack)樹 (Tree),僅管這些資料結構在內部實作與外部使用的界面上,各有不同,但基本上我們都會希望這些資料結構,能提供有巡訪 (Traverse) 資料的能力。)

當然如果你是一個很講究效能的人,執行查詢時,必然要了解一下延遲載入預先載入的差別在哪了!

延遲載入:(執行foreach取出每一個元素都會執行LINQ)string[] names = { "Tom", "Mary", "Charlie", "John" };
var query = from p in names
where p.Length == 3
select p;
foreach (var item in query)
{
Console.WriteLine(item.ToString());
Console.ReadLine();
}

另一種方式

預先載入:(在執行foreach前,已執行完LINQ的查詢)string[] names = { "Tom", "Mary", "Charlie", "John" };
var query = from p in names
where p.Length == 3
select p;
var loadedQuery = from p in query.ToList()
where p.StartsWith("T")
select p;
foreach (var item in loadedQuery)
{
Console.WriteLine(item.ToString());
Console.ReadLine();
}

撰寫程式時,LINQ也所提供的兩種寫法:

編程式(Imperative):(lambda)

IEnumerable<int> results = source
.Where(x => x > 0)
.OrderByDescending(y => y);

宣告式(Declarative):(link)

var query = from p in names
where p.Length == 3
select p;

以上,這些可以多多了解一下LINQ的語言強大,畢竟,目前很多語言已經開始支持函式編程,算是必學的撰寫技巧之一,希望此篇能夠對讀者有提升觀念,謝謝!