C# 3.0 引入查詢運算式,將類 SQL 語法內建於語言中,支援對記憶體集合、XML、資料庫等資料源進行統一查詢。本文對比傳統 ADO.NET 字串拼接 SQL 與 LINQ 查詢運算式,解析語法結構與編譯器轉換邏輯。
string sql = "SELECT Name, Phone FROM Customers WHERE City = @City";
using (var cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@City", "London");
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
string name = reader.GetString(0);
string phone = reader.GetString(1);
// 編譯期無法檢查欄位名、型別
}
}
}
var contacts = new List
{
new Contact("Michael", "520-331-2718", "33140 SW Liverpool Lane", "WA"),
new Contact("Jennifer", "503-998-1177", "1245 NW Baypony Dr", "OR"),
new Contact("Sean", "515-127-3340", "55217 SW Estate Dr", "WA")
};
var waContacts = from c in contacts
where c.State == "WA"
select new { c.Name, c.Phone };
foreach (var c in waContacts)
Console.WriteLine($"Name: {c.Name}, Phone: {c.Phone}");
| 子句 | SQL 對應 | 說明 |
|---|---|---|
from | FROM | 指定資料源與範圍變數 |
where | WHERE | 篩選條件 |
select | SELECT | 投射結果型別(可為匿名型別) |
group ... by | GROUP BY | 分組 |
orderby | ORDER BY | 排序 |
join | JOIN | 內部/外部聯結 |
let | — | 引入子運算式別名 |
into | — | 續接查詢結果 |
查詢運算式純屬語法糖,編譯器將其轉換為標準查詢運算子擴充方法:
// 原始查詢運算式
var q = from c in contacts
where c.State == "WA"
select new { c.Name, c.Phone };
// 編譯器轉換後
var q = contacts
.Where(c => c.State == "WA")
.Select(c => new { c.Name, c.Phone });
Where, Select, OrderBy 等,直到迭代(foreach、ToList())才執行。ToList(), ToArray(), Count(), First() 等,強制執行並具體化結果。查詢運算式讓 C# 具備宣告式資料處理能力,編譯期型別檢查、IntelliSense 支援、延遲執行特性,極大提升開發效率與程式碼品質。理解其轉換為方法鏈的本質,有助於進階優化與除錯。