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

學習 Linq to SQL (六):核心特性深度解析 — 延遲執行、DataLoadOptions、身分識別快取、DataContext 隔離

     編輯:關於.NET

1. 延遲執行

查詢語法 (IQueryable) 僅建立描述,實際 SQL 於 列舉時 (foreach、ToList、Count 等) 才發送。重複列舉會重複查詢:

var q = from c in ctx.Customers select c;
foreach (var c in q) Console.Write(c.CustomerID); // SQL #1
foreach (var c in q) Console.Write(c.ContactName); // SQL #2 再查一次
// 建議:var list = q.ToList(); 再對 list 操作

優點:可像拼接 SQL 般組合查詢 (OrderBy、Where 等)。

2. DataLoadOptions (預載/篩選關聯)

LoadWith:預載關聯集合

var opts = new DataLoadOptions();
opts.LoadWith<Product>(p => p.Order_Details);
ctx.LoadOptions = opts;
// 產生 LEFT OUTER JOIN 單一 SQL,避免 N+1 查詢

AssociateWith:篩選預載內容

opts.AssociateWith<Product>(p => p.Order_Details.Where(od => od.Quantity > 80));
// JOIN 時帶入 WHERE Quantity > 80

限制

  • 僅支援 一層 一對多關聯 (Customer→Orders→Order_Details 會退化為 N 次查詢)。
  • 多對一關聯 (Product→Category、Order_Detail→Order) 無層數限制,可一次 JOIN 多個多對一。

3. 主鍵身分識別快取

同一 DataContext 內,依主鍵查詢單筆 (Single) 會先查快取,不發 SQL:

var c1 = ctx.Customers.Single(c => c.CustomerID == "ANATR");
c1.ContactName = "zhuye";
var c2 = ctx.Customers.Single(c => c.CustomerID == "ANATR"); // 直接回傳快取物件
Console.WriteLine(c2.ContactName); // 輸出 zhuye (未 SubmitChanges)

注意:若使用預存程序更新,快取與資料庫可能不一致。

4. DataContext 隔離與 Attach

跨 Context 傳遞實體需 Attach。主鍵標記 IsVersion=true 可啟用樂觀平行存取:

[Column(..., IsPrimaryKey=true, IsVersion=true)] public string CustomerID { get; set; }
// 更新
var c = new Customer { CustomerID="ALFKI", ContactName="zhuye", CompanyName="1111" };
ctx.Customers.Attach(c, true); // true = 視為已修改
ctx.SubmitChanges();

產生 WHERE (PK=@p0) AND (PK=@p1) 確保版本一致。

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