Hxj.Data ORM 框架內建快取機制支援配置層級設定,但實務上常需針對單一查詢自訂快取行為。本文介紹三大擴充方法:Refresh()、SetCacheTimeOut()、SetCacheDependency(),實現查詢級快取精細控制。
// 直接查詢資料庫,並更新快取
var product = DbSession.Default.From<Products>()
.Where(Products._.ProductID == 1)
.Refresh() // 忽略快取,重新查詢並重建快取
.ToFirst();
適用場景:資料剛更新、管理員手動刷新、關鍵業務需最新資料。
// 此查詢快取 180 秒,覆蓋全域配置
var product = DbSession.Default.From<Products>()
.Where(Products._.ProductID == 1)
.SetCacheTimeOut(180) // 秒
.ToFirst();
// 後續 180 秒內相同查詢直接命中快取
var cached = DbSession.Default.From<Products>()
.Where(Products._.ProductID == 1)
.ToFirst();
注意:即使全域配置未啟用該實體快取,此設定仍會生效。
// 綁定檔案變更失效
var dep = new System.Web.Caching.CacheDependency(Server.MapPath("~/2.txt"));
var product = DbSession.Default.From<Products>()
.Where(Products._.ProductID == 1)
.SetCacheDependency(dep)
.ToFirst();
// 2.txt 未變更時,快取持續有效
支援類型:CacheDependency (檔案/目錄)、SqlCacheDependency (資料表)、AggregateCacheDependency (多重依賴)。
var product = DbSession.Default.From<Products>()
.Where(Products._.ProductID == 1)
.SetCacheTimeOut(300)
.SetCacheDependency(fileDep)
.Refresh() // 立即刷新並套用上述策略
.ToFirst();
快取鍵基於 **生成的 SQL 語句**,因此:
Where(A).Where(B) vs Where(B).Where(A)) → SQL 不同 → 錯失快取、浪費記憶體。Refresh() 或清除快取。