首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0 查詢運算式:LINQ 語法與 SQL 相似度解析

     編輯:關於C語言

前言

C# 3.0 引入查詢運算式,將類 SQL 語法內建於語言中,支援對記憶體集合、XML、資料庫等資料源進行統一查詢。本文對比傳統 ADO.NET 字串拼接 SQL 與 LINQ 查詢運算式,解析語法結構與編譯器轉換邏輯。

傳統 ADO.NET 痛點


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);
            // 編譯期無法檢查欄位名、型別
        }
    }
}
  • SQL 字串編譯期不可驗證。
  • 參數綁定鬆散,易出錯。
  • 結果存取需索引或字串鍵,型別不安全。

LINQ 查詢運算式


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 對應說明
fromFROM指定資料源與範圍變數
whereWHERE篩選條件
selectSELECT投射結果型別(可為匿名型別)
group ... byGROUP BY分組
orderbyORDER BY排序
joinJOIN內部/外部聯結
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 支援、延遲執行特性,極大提升開發效率與程式碼品質。理解其轉換為方法鏈的本質,有助於進階優化與除錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved