2016-05-15 36 views
0

我有一個單一的DbContext。首先我做的:EF 6緩存withing上下文

var all = context.MySet.Where(c=>c.X == 1).ToList(); 

後(使用相同的上下文實例)

var special = context.MySet.Where(c=>(c.X == 1) && (c.Y===1).ToList(); 

的數據庫再次命中!由於第一個查詢保證 返回第二個中將存在的所有元素,爲什麼數據庫被再次擊中?

+0

*第一個查詢保證返回第二個將存在的所有元素*除非在平均時間內插入/更新/刪除了記錄如果要訪問緩存,查詢'Local'集合:'context.MySet.Local'。 –

回答

0

如果你想避免再次敲擊數據庫,那麼你可以試試這個;

var special = all.Where(c=>(c.X == 1) && (c.Y===1).ToList(); 

由於所有對象的列表中已包含您希望你可以查詢該名單的一切,該數據庫將不會再次襲來。

您的鏈接表達式只是一個查詢,它只在枚舉時纔會檢索數據(例如調用.ToList())。您可以不斷更改查詢,並在您需要的時候實際獲取數據。實體框架會將您的查詢轉換爲後臺的SQL查詢,然後獲取數據。

避免在每個查詢的末尾寫入「ToList()」,因爲這會強制EF訪問數據庫。

如果你只有一次點擊數據庫一次,然後通過調用「ToList(),To.Array等等來獲得你需要的數據,然後使用該集合(在你的情況下是」全部「集合),因爲這是保存所有數據的對象