1、批量添加數據程序員
1 static void Main(string[] args) 2 { 3 add(); 4 add2(); 5 Console.ReadKey(); 6 } 7 8 static void add() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 Stopwatch st = new Stopwatch(); 12 st.Start(); 13 for (int i = 0; i < 1000; i++) 14 { 15 db.User.Add(new User { NAME = "張三" +i, AGE = i }); 16 db.SaveChanges(); 17 } 18 st.Stop(); 19 Console.WriteLine("用時:{0}毫秒", st.ElapsedMilliseconds); 20 21 22 } 23 24 static void add2() 25 { 26 DemoDbEntities db = new DemoDbEntities(); 27 Stopwatch st = new Stopwatch(); 28 st.Start(); 29 for (int i = 0; i < 1000; i++) 30 { 31 db.User.Add(new User { NAME = "張三" + i,AGE=i }); 32 33 } 34 db.SaveChanges(); 35 st.Stop(); 36 Console.WriteLine("用時:{0}毫秒", st.ElapsedMilliseconds); 37 38 }
經過以上的對比發現,若是每次新增長一個條數據,就用EF SaveChanges 一次,這樣會很消耗性能,能夠所有標記完了以後,再去調用SaveChanges方法保存數據,這樣性能會有所提升。sql
2、批量刪除數據庫
1 static void Main(string[] args) 2 { 3 del(); 4 Console.ReadKey(); 5 } 6 7 #region EF批量刪除 8 static void del() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 12 List<User> list = db.User.Where(u => u.NAME == "張三1").ToList(); 13 //Any表示只要集合中有值就返回true 否者返回float 14 if (list != null && list.Any()) 15 { 16 foreach (User item in list) 17 { 18 db.User.Remove(item); 19 } 20 db.SaveChanges(); 21 } 22 Console.WriteLine("刪除成功"); 23 } 24 #endregion
先查詢出結果,保證數據庫中有值,再刪除。緩存
3、EF編輯數據ide
第一種方式是查詢以後在編輯;性能
第二種方式直接傳入一個須要修改的model實體,能夠是部分字段spa
1 static void Main(string[] args) 2 { 3 edit2(); 4 Console.ReadKey(); 5 } 6 #region EF編輯數據 7 static void edit() 8 { 9 DemoDbEntities db = new DemoDbEntities(); 10 11 var model = db.User.FirstOrDefault(u => u.NAME == "張三3"); 12 model.NAME = "李四"; 13 db.SaveChanges(); 14 Console.WriteLine("編輯成功"); 15 } 16 static void edit2() 17 { 18 DemoDbEntities db = new DemoDbEntities(); 19 20 User model = new User() { 21 ID=4, 22 NAME="王五" 23 }; 24 //獲取代理對象類的狀態爲Detaceh 25 System.Data.Entity.Infrastructure.DbEntityEntry entry = db.Entry(model); 26 //一、將代理類的狀態修改爲 Unchanged 二、將代理類中的須要更新的字段的IsModified修改爲true 27 entry.State = System.Data.Entity.EntityState.Unchanged; 28 entry.Property("NAME").IsModified = true; 29 //解決對一個或多個實體驗證失敗 的方法:關閉EF的實體合法性檢查 30 db.Configuration.ValidateOnSaveEnabled = false; 31 db.SaveChanges(); 32 Console.WriteLine("編輯成功"); 33 } 34 #endregion
4、EF中join的使用方法pwa
1 static void Main(string[] args) 2 { 3 efjoin2(); 4 Console.ReadKey(); 5 } 6 7 #region EF連表查詢的2種方式 8 static void efjoin() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 12 var sql = db.User.Join(db.GroupInfo, u => u.GroupinfoID, g => g.ID, (c, g) => new {uername=c.NAME,g.NAME }); 13 14 var list = sql.ToList(); 15 16 list.ForEach(c => Console.WriteLine(c.uername+""+c.NAME)); 17 } 18 static void efjoin2() 19 { 20 DemoDbEntities db = new DemoDbEntities(); 21 22 db.User.Include("GroupInfo").Where(c => true).ToList().ForEach(c => Console.WriteLine(c.NAME + "" + c.GroupInfo.NAME)); 23 24 } 25 #endregion
5、 EF分頁查詢3d
1 static void Main(string[] args) 2 { 3 fenye(); 4 Console.ReadKey(); 5 } 6 7 #region EF分頁 8 static void fenye() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 //在分頁前先要是用OrderBy或者OrderByDescending對數據進行正序或者倒序而後在skip()跳過多少條,take()查詢多少條。 12 db.User.OrderBy(u => u.ID).Skip(0).Take(5).ToList().ForEach(c=>Console.WriteLine(c.ID)); 13 } 14 #endregion
6、EF存儲過程的調用代理
1 static void Main(string[] args) 2 { 3 cunchu(); 4 Console.ReadKey(); 5 } 6 7 #region EF存儲過程的使用 8 static void cunchu() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 //調用存儲過程USP_GetPagedArticleList 12 int count = 0; 13 //因爲totalItems是一個輸出參數,因此由程序員本身定義 14 ObjectParameter ps = new ObjectParameter("totalItems", count); 15 16 db.USP_GetPagedArticleList(1, 2, ps).ToList().ForEach(u=>Console.WriteLine(u.ID)); 17 18 Console.WriteLine("總行數=" + ps.Value); 19 } 20 #endregion
7、EF中執行SQL
1 static void Main(string[] args) 2 { 3 EFtoSql(); 4 Console.ReadKey(); 5 } 6 7 #region EF中執行SQL語句 8 static void EFtoSql() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 string sql = "update [DemoDb].[dbo].[User] set NAME=@name where ID>@id"; 12 13 SqlParameter[] p = new SqlParameter[] { 14 new SqlParameter("@id",5), 15 new SqlParameter("@name","王五") 16 }; 17 db.Database.ExecuteSqlCommand(sql,p); 18 Console.WriteLine("修改爲功"); 19 } 20 21 #endregion
八 EF提升查詢的方法AsNoTracking
1 static void Main(string[] args) 2 { 3 EFAsNoTracking(); 4 Console.ReadKey(); 5 } 6 #region EF不跟蹤查詢AsNoTracking() 7 static void EFAsNoTracking() 8 { 9 DemoDbEntities db = new DemoDbEntities(); 10 //使用AsNoTracking()能夠提升查詢效率,不用在DbContext中進行緩存 11 db.User.AsNoTracking().Where(u => u.ID > 5).ToList().ForEach(c => Console.WriteLine(c.ID)); 12 } 13 #endregion
9、EF上下文容器中Set<T>泛型方法的使用
1 static void Main(string[] args) 2 { 3 EFSet(); 4 Console.ReadKey(); 5 } 6 7 #region EF上下文容器中的Set<T>泛型方法的做用 8 static void EFSet() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 //db.Set<User> 至關於db.User 12 db.Set<User>().Where(u => u.ID > 5).ToList().ForEach(c => Console.WriteLine(c.ID)); 13 } 14 #endregion