LINQ (Language Integrated Query), 允許你編寫結構化並且是類型安全的查詢去訪問本地對象集合和遠程的數據源. 是.NET Framework 3.5提供的一個新特性.
LINQ 允許你查詢任何實現了IEnumerable<>的集合, 可以是一個數組(Array), 列表(List), XML DOM或者是遠程的數據源(例如SQL SERVER). LINQ提供了編譯時類型檢查和動態查詢組合的好處.
用於支持LINQ的核心類型主要定義在System.Core這個程序集(Assembly)的System.Linq和System.Linq.Expressions命名空間中
LINQ的基本數據單元是序列(sequence)和元素(element). 一個序列可以是任何實現了范型IEnumerable接口的對象, 而一個元素是序列中的每一項. 看一個簡單的例子:
string[] names = {“James”, “Tom”, “Harris”};
這個例子中names是一個序列, 和James, Tom和Harris是元素. 我們把這樣一個序列叫做本地序列因為它代表了一個存在於內存當中的本地對象集合.
一個查詢操作是一個轉換序列的方法. 一個典型的查詢操作接受一個輸入序列並且將其轉換成一個輸出序列.在System.Linq中的Enumberable類中, 大於存在40個左右的查詢操作方法, 全部都被實現為靜態的擴展方法, 他們被稱為標准查詢操作.
一個查詢是一個通過查詢操作方法轉換了序列的表達式. 最簡單的查詢包括了一個輸入序列和一個操作方法. 舉個例子, 我們可以對一個簡單的數組應用一個Where操作方法以便過濾出那些長度不小於4個字符的元素.
1: string[] names = { “Tom”, “Dick”, “Harry” };
2:
3: IEnumerable<string> filteredNames = System.Linq.Enumerable.Where(names, n => n.Length >= 4);
4:
5: foreach (string n in filteredNames)
6:
7: Console.Write(n + “|”); // Dick|Harry|
因為標准的查詢操作都被實現為擴展方法, 我們可以直接在names上面調用Where方法, 猶如它是一個實例方法一樣:
IEnumerable<string> filteredNames = names.Where(n => n.Length >= 4)
以下是一個完整的例子, 為了能夠通過編譯, 你必須導入System.Linq命名空間:
1: using System;
2:
3: using System.Linq;
4:
5: class LinqApp
6: {
7:
8: static void Main()
9:
10: {
11:
12: string[] names = { “Tom”, “Dick”, “Harry” };
13:
14: IEnumerable<string> filteredNames = names.Where(n => n.Length >= 4);
15:
16: foreach (string name in filteredNames)
17:
18: Console.Write(name + “|”);
19:
20: }
21:
22: }
23:
24: // RESULT: Dick|Harry|
通過新的關鍵字var, 我們還可以使查詢語句更簡短一些:
var filteredNames = names.Where(n => n.Length > = 4);
大多數的查詢操作方法都接受一個Lambda表達式作為輸入參數, Lamdba表達式用於指導和塑造查詢, n => n.Length >= 4就是我們上述方法中用到的Lamdba表達式. 輸入參數將會響應到每一個元素, 在這個例子中, 輸入參數n代表在數組中的每一個元素, 並且它的類型是string. Where操作方法要求Lambda表達式返回一個bool值, 如果返回true, 表示該元素將被包含進輸出序列中.
另外在C#當中還定義了一種特殊的語法用於編寫查詢, 成為復合查詢語法, 一個例子如下:
IEnumerable<string> theName = from n in names where n.Contains(“T”)
select n;
Lambda語法和復合查詢語法是互補的. 待續!