var q = from c in db.Customers select c.ContactName; // 僅宣告,未執行
// 需要資料時才查詢:
var list = q.ToList(); // 或 ToArray()
延遲載入:只有在枚舉結果時才發送 SQL。
// 查詢運算式
var q = from c in db.Customers where c.City == "London" select c;
// 自動轉換為
var q = db.Customers.Where(c => c.City == "London").Select(c => c);
兩者等價。方法鏈中操作符順序不影響結果,但查詢運算式 select 必須在最後。
c => c.City == "London" 解析c:隱含型別參數,編譯器依 Customers 推斷為 Customer 型別=>:Lambda 運算子c.City == "London":運算式本體,回傳 bool(Customer c) => c.City == "London"本質是匿名方法簡化形式,編譯器自動推斷型別。
Lambda 參數 c 即代表結果集中的單一 Customer 物件。
select new { c.ContactName, c.Phone }
// 編譯器自動產生含 ContactName、Phone 屬性的匿名類別
select new { Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone }
select new { p.ProductID, HalfPrice = p.UnitPrice / 2 }
var d = new Person { Name = "s" }; // 不需建構函式,直接設定屬性
var d = new { Name = "s" }; // 匿名型別:編譯器產生類別並初始化
注意:var d = new { "s" } 編譯失敗(無屬性名),但 string c = "d"; var d = new { c } 成功(屬性名為 c)。
var 為編譯器關鍵字,編譯期依指派值推斷型別。var c = null 無法編譯(無法推斷)。C# 3.0 仍為強型別語言。