這次我們來看 EntityFramework-Plus(免費開源) 庫的用法相比其他擴展庫,這個更加新並且用法更加簡單
這是一個對Entity Framework進行擴展的類庫.支持EF EF5, EF6, EF Core,來彌補EF目前的短板
支持功能:
- 批量刪除
- 批量更新
Linq表達式
- 從緩存查詢
- 延遲加載
- 過濾查詢
組合查詢功能
1.從NUGET安裝組件就OK
當然你要選擇你對應的版本,並且同時你也安裝了對應版本的EF版本(我選擇EF6的擴展,那么我應該也對應現有的EF6)
2.操作(批量刪除)
安裝nuget包之后我們會發現我們平時慣用的linq表達式多了一些智能提示
好吧確實很簡單,刪除顏色是blue條件的所有數據
using (DBContainer ctx = new DBContainer()) { ctx.Spl_Product.Where(a => a.Color == "blue").Delete(); }
3.操作(批量更新)
批量更新創建日期3天以前的數據,讓color=red,code=xxxx
using (DBContainer ctx = new DBContainer()) { ctx.Spl_Product.Where(a => a.CreateTime < DateTime.Now.AddDays(-3)).Update(a=> new Spl_Product { Color="red" , Code="xxxx"}); }
4.設置緩存
在從緩存查詢之前,我們必須引用 System.Runtime.Caching來支持系統緩存(而且可以設置緩存的時間)
下面來看怎么設置緩存:
using (DBContainer ctx = new DBContainer()) { //查詢數據之后並進行緩存 var list = ctx.Spl_Product.Where(x => x.Code=="red").FromCache(); // (EF5 | EF6) 讓查詢緩存維持2個小時 var list2 = ctx.Spl_Product.Where(x => x.Code=="red").FromCache(DateTime.Now.AddHours(2)); }
我們在查詢的最后加上.FromCache和.FromCache(DateTime.Now.AddHours(2))來分別設置緩存,所以我們在第一次查詢之后就可以設置緩存
using (DBContainer ctx = new DBContainer()) { // EF Core 的寫法 var options = new MemoryCacheEntryOptions() { SlidingExpiration = TimeSpan.FromHours(2) }; var states = ctx.Spl_Product.Where(x => x.Color=="red").FromCache(options); }
5.從緩存查詢
using (DBContainer ctx = new DBContainer()) { //從緩存中查詢,如果沒有緩存即從數據庫查詢 var list3 = ctx.Spl_Product.Where(x => x.Code=="red").FromCache("list"); }
注意:.FromCache("list"); list 是第四點設置的緩存
6.清空緩存
using (DBContainer ctx = new DBContainer()) { //清空緩存 QueryCacheManager.ExpireTag(new string[] { "list", "list2" }); }
7.延遲加載
using (DBContainer ctx = new DBContainer()) { // 沒有使用緩存和延遲加載的寫法 var count = ctx.Spl_Product.Count(); // 使用緩存 ctx.Spl_Product.DeferredCount().FromCache(); // 延遲查詢 ctx.Spl_Product.DeferredCount().FutureValue(); }
似乎上面的七點,看起來使用方式都非常簡單易懂,擴展自EF當然只是需要在后面.一下就出來,只需要記得Delete,Update,FromCaChe
下面來說最后一點,這一點比較有趣的,全局過濾,我們有時實際也是很需要用到的。那么在什么時候用下面先來看語句
8.過濾查詢
//創建全局過濾 QueryFilterManager.Filter<Spl_Product>(x => x.Where(c => c.IsDel==false)); DBContainer ctx = new DBContainer(); // 讓過濾生效 QueryFilterManager.InitilizeGlobalFilter(ctx); //以后的使用 //SELECT * FROM Spl_Product WHERE IsDel = true var customer = ctx.Spl_Product.ToList();
從上面的結果可以看到我查詢的結果自動加上了IsDel=false,許多場景我們有時候刪除數據是邏輯刪除,並不是物理刪除
這時候我讓所有查詢都是查詢IsDel為假的條件數據,而不用每一個查詢語句都需要去加
似乎EntityFramework-Plus不僅僅能做的如此,他還有很多強大的功能,其他形式的查詢,或者Audit追蹤數據
有興趣進階和源碼請點擊跳轉