LINQ (Language Integrated Query) 是 C# 3.0 (VS 2008 "Orcas") 引入的語言層級查詢功能,支援 XML (LINQ to XML)、資料庫 (LINQ to SQL/Entities/DataSet)、記憶體物件 (LINQ to Objects) 等多種資料源。

Anders Hejlsberg 最初構想「序列運算子」作為擴充方法:
// 理想語法
sequence locals = customers.where(ZipCode == 98112);
但 C# 2.0 僅支援匿名方法,語法冗長:
IEnumerable locals = EnumerableExtensions.Where(customers,
delegate(Customer c) { return c.ZipCode == 98112; });
簡潔的匿名函式語法,支援型別推論:
// C# 3.0
var locals = customers.Where(c => c.ZipCode == 98112);
=> 運算子分隔參數與主體。Func<Customer, bool>)。靜態方法以 this 修飾第一個參數,可用實例語法呼叫:
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
using 引入命名空間啟用。IDog.Bark() 預設 2 秒)。投影多欄位時無需預先定義類別:
var locals = customers.Select(c => new { c.Name, c.Address });
// 編譯器隱式產生 class { public string Name; public string Address; }
new { FullName = c.First + " " + c.Last }。var 使用。var i = 1; // 編譯器推論為 int
var dict = new Dictionary<string, List<Customer>>(); // 簡化泛型宣告
強型別:var 非動態型別,編譯期確定,不可變更。
var c = new Customer { Name = "Roger", Address = "1 Wilco Way" };
// 等同於 new Customer() { Name = "...", Address = "..." },可省略 ()
解決無對應建構函式時的屬性指派問題。
易用性研究顯示開發者偏好 SQL 風格,設計團隊加入查詢運算式:
var locals = from c in customers
where c.ZipCode == 98112
select new { FullName = c.FirstName + " " + c.LastName,
HomeAddress = c.Address };
編譯器完全轉換為方法呼叫鏈:
var locals = customers
.Where(c => c.ZipCode == 98112)
.Select(c => new { FullName = c.FirstName + " " + c.LastName,
HomeAddress = c.Address });
from, where, select, orderby, group by, let, join(from ... select ...).Count()LINQ 語法歷經多年演進:序列運算子構想 → Lambda → 擴充方法 → 匿名型別 → var → 物件初始化 → 查詢運算式。每項特性獨立實用,組合成強大的整合式查詢平台,讓 C# 成為同時擁有強型別與聲明式查詢能力的語言。