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的語言強大,畢竟,目前很多語言已經開始支持函式編程,算是必學的撰寫技巧之一,希望此篇能夠對讀者有提升觀念,謝謝!