EntityFramework Core 3.x添加查询提示(NOLOCK)
前幾天看到有博客園中有園友寫了一篇關于添加NOLOCK查詢提示的博文,這里呢,我將介紹另外一種添加查詢提示的方法,此方式源于我看過源碼后的實現,孰好孰歹,請自行判之,接下來我們一起來看看。
在EntityFramework中,如需要添加查詢提示需要自定義實現攔截器,但在EntityFramework Core中除了支持實現自定義攔截器外,還可以通過繼承自對應類進行復寫,那就是QuerySqlGenerator類,存在于命名空間【Microsoft.EntityFrameworkCore.Query】,在此類通過我們所寫的表達式實現所有查詢組合,比如我們需要用到的對表的設置,如下:
從源碼中可看到SqlServerQuerySqlGenerator類繼承自上述類,若我們需要重寫的話繼承自此類即可,比如在此類中進一步重寫了三個表達式,我們隨便看一個,如下:
上述意在表明:當我們進行在內存中通過Skip和Take進行分頁時,因為Skip會翻譯成Offset,而Take會翻譯成Limit,若我們直接跳過Skip而寫Take,此時在生成的Sql語句中添加TOP,很顯然這是合情合理而且合法的。舉個栗子,如下:
那么此類是何時進行實例化的呢?通過SqlServerQuerySqlGeneratorFactory工廠類實例化,如下:
那么上述Sql查詢工廠類到底具體是在什么時候被注冊的呢,如下已省略其他注冊類:
通過上述AddEntityFrameworkSqlServer名稱可猜測該方法肯定是在實例化上下文時注冊所有需要用到的接口具體實現,有了這個就好辦了,為了不破壞原有的實現,我們自定義Sql查詢生成類并繼承自SqlServerQuerySqlGenerator并重寫對表的設置并添加NOLOCK查詢提示,如下:
接下來我們則需要實現自定義查詢工廠并繼承自默認提供的查詢工廠類從而實例化上述自定義的查詢類,如下:
那我們如何將默認提供的查詢工廠類替換為上述自定義查詢工廠類呢?稍微對DbContextOptionsBuilder類有所了解的童鞋應該知道,在該類中提供了ReplaceService方法來給我們替換EF Core中默認的實現,如下:
到此就已經實現了添加NOLOCK查詢提示,對于此種實現方式同樣應該也適用于2.x版本,只不過稍微注意下對于自定義類構造函數參數可能略有不同,對于自定義實現,還是寫成擴展方法比較好,這樣也方便統(tǒng)一管理,看個人諾,比如寫成如下:
通過攔截器或者本節(jié)從源頭生成Sql語句時添加對表的查詢提示皆可,到底哪一個好呢?自行判斷吧,其他就沒啥可以進行總結的了,暫時到此為止吧。
總結
以上是生活随笔為你收集整理的EntityFramework Core 3.x添加查询提示(NOLOCK)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用EF.Core将同一模型映射到多个表
- 下一篇: Xamarin.Forms客户端第一版