日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EntityFramework Core 3.x添加查询提示(NOLOCK)

發布時間:2023/12/4 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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版本,只不過稍微注意下對于自定義類構造函數參數可能略有不同,對于自定義實現,還是寫成擴展方法比較好,這樣也方便統一管理,看個人諾,比如寫成如下:

通過攔截器或者本節從源頭生成Sql語句時添加對表的查詢提示皆可,到底哪一個好呢?自行判斷吧,其他就沒啥可以進行總結的了,暫時到此為止吧。

總結

以上是生活随笔為你收集整理的EntityFramework Core 3.x添加查询提示(NOLOCK)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。