Entity FrameWork 中使用Lambda訪問數據庫性能優化

本文轉載自博客園

點擊打開鏈接

在使用Entity Framework 訪問數據庫時,我們經常使用Lambda表達式,但是如果不小心的話,很容易就掉到坑裏了。比如下面的例子:用Lambda訪問MSSqlServer中的NewsInfo表中id小於20的記錄。

代碼如下:

運行程序,程序工作正常。打開SQL Server Profiler 跟蹤EF生成的SQL語句,結果如下:

這正是我們想要的SQL語句。下面我們將程序改一下,把Lambda表達式以參數的形式傳遞給一個方法GetNewsList(Func<NewsInfobool> lambda)。方法GetNewsList的代碼如下:

 

Main()方法如下:

這時再次運行程序,程序工作正常,不過時間長了一些,用SQL Server Profiler跟蹤,產生的SQL語句如下:

“坑”出現了,EF是直接從NewsInfo表中取出所有的數據到內存中,然後在內存中再做一次檢索。顯然,這樣的方式在數據量小的時候並不太影響性能。但是在大數據量,高併發訪問的時候,這種方式簡直就是噩夢。

那麼怎樣改善呢?System.Linq.Expressions命名空間的Expression可以幫我們解決以上問題。修改後的GetNewsList()方法代碼如下:

Main()方法不變。下面再次運行代碼,並跟蹤產生的SQL如下:

這下正常了。Expression<TDelegate>類可以以表達式目錄樹的形式將強類型 lambda 表達式表示爲數據結構,從而在編譯階段產生我們想要的SQL代碼。

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章