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代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM