entity framework 新手入門篇(4)-entity framework擴展之 entityframework.extended


對於EF的操作,我們已經有了大概的了解了,但對於實戰來說,似乎還欠缺着一些常用的功能,那就是批量的刪除,更新數據。

承接上面的部分,我們有一個叫做House的數據庫,其中包含house表和seller表。

一、使用原生EF如何實現批量刪除和修改?

        //批量修改
        public static bool UpdateAllPrice(decimal price)
        {
            bool isOk = false;
            using (HouseEntities db = new HouseEntities())
            {
                var houseList = db.House.ToList();
                //首先獲取所有房屋的列表(相當於select * from house,雖然實際會把*替換為所有字段,這樣能提升性能)
                houseList.ForEach(x => {
                    x.Price = price;//做一個foreach操作來把每一項的價格改為傳入的價格
                    db.Entry(x).State = System.Data.Entity.EntityState.Modified;//把修改后的實體標為已修改
                });
                isOk =  db.SaveChanges() > 0;//若修改數量大於0說明成功
            }
            return isOk;
        }

        //批量刪除
        public static bool DeleteHouseByRegion(string region)
        {
            bool isOk = false;
            using (HouseEntities db = new HouseEntities())
            {
                var houseList = db.House.Where(x=>x.Region==region).ToList();
                //首先獲取符合條件的房屋的列表
                houseList.ForEach(x =>
                {
                    db.Entry(x).State = System.Data.Entity.EntityState.Deleted;//把修改后的實體標為已刪除
                });
                isOk = db.SaveChanges() > 0;//若修改數量大於0說明成功
            }
            return isOk;
        }

由上面的示例代碼可以看到。無論是批量刪除、修改部分數據,還是所有數據。首先都需要對操作對象進行查詢並實例化,再使用遍歷方法對其進行修改,刪除。

這種方式看起來十分奇怪,以前用SQL,Delete House where region='xxx',或者update house set price=123.123所能實現的功能,現在竟然浪費了這么多的功夫,光是浪費功夫也就算了,EF這種寫法在性能上也存在着十分巨大的問題(光是每次查詢就夠浪費性能的了,更別說維護實例的狀態,好在EF會對沒有更新的對象撤銷UPDATE操作,但感覺還是得不償失)。

那問題在這里已經很明顯了,如何解決它呢?那就要用到entityframework中一個非常好用的擴展“Entityframework.Extended”。這是一個開源的擴展類庫,需要.NET 4.0以上的版本才能夠支持。你可以在nuget和github上找到它。它使用Lambda表達式樹的形式,對對象進行了解析,在解析后直接生成SQL指令來完成數據庫操作,相比傳統SQL來說,這樣做不僅使我們的代碼更加優美,在安全性和性能方面,也使我們更加放心。

二、Entityframework.Extended安裝

和其他類庫一樣,安裝的時候只要在NUGET上進行搜索就行了,如果搜索不到請嘗試添加8.8.8.8來做DNS服務器(實在找不到就等等吧,國外網站經常被牆,哪怕是正常的網站)。

如上圖所示即可完成安裝(什么?你找不到nuget?好吧,我想我的第一篇文章和VS右上角自帶的搜索框能幫助你。

三、使用Entityframework.Extended實現批量刪除和修改

        //批量更新
        public static bool UpdateAllPrice(decimal price)
        {
            bool isOk = false;
            using (HouseEntities db = new HouseEntities())
            {
                isOk = db.House.Update(x => new House() { Price = price }) > 0;
                //直接會生成update house set price=xxx的語句並返回受影響行數,這里的X無實際作用,但作為MemberInitExpression,其卻是不可缺少的一個部分,這里要注意,不能先new對象再進行對象傳輸,因為抓取准確字段的時候,我們要用到init表達式,如果對象已經被生成,所有非空字段都將被初始化,這對我們來說,完全不必要。
            }
            return isOk;
        }

        //批量刪除
        public static bool DeleteHouseByRegion(string region)
        {
            bool isOk = false;
            using (HouseEntities db = new HouseEntities())
            {
                isOk = db.House.Where(x => x.Region == region).Delete() > 0;//在where后面直接跟Delete就可以實現批量刪除了, 是不是很方便?
            }
            return isOk;
        }

上面的代碼就是使用extended擴展庫之后的寫法了,不僅整個代碼優美了許多,更實現了更好的性能。在使用擴展庫之前,別忘了引用EntityFramework.Extensions命名空間,擴展類是沒有SDK自動提醒的。

另外,大家有沒有發現?我之前說的,修改,刪除,添加操作后一定要savingchanges(),這里沒寫,是不是錯了?當然不是,擴展庫直接生成了SQL語句並采用了ADO.NET的方式進行了執行,所以並不需要寫savingchanges,在這些擴展方法執行之后就會返回受影響的行數了。


免責聲明!

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



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