Entity Framework学习三:查询、插入、更新和删除操作
生活随笔
收集整理的這篇文章主要介紹了
Entity Framework学习三:查询、插入、更新和删除操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.LINQ過濾數據?
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a")select person; var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a"));
兩種不同的寫法,效果一樣。
- 多條件組合查找
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")select person; var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b"));
- 對查找結果排序升序:
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")orderby person.FirstName,person.LastNameselect person;var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b")).OrderBy(p => p.FirstName).ThenBy(p => p.LastName);
- 對查找結果排序降序:
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")orderby person.FirstName,person.LastNamedescendingselect person;var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b")).OrderByDescending(p => p.FirstName).ThenByDescending(p => p.LastName);
- 延遲加載和貪婪加載(Lazy Loading和eager loading)
如果不確定是否要加載關聯數據時就使用延遲加載,否則就使用貪婪加載。當然這個不是固定的看具體什么場景下使用。默認情況下延遲加載是生效的,可以在創建DbContex后配置選項
context.Configuration.LazyLoadingEnabled = false; 2.插入數據
多種方法,不多說看代碼:
- 方法一
var person = new Person { BirthDate = new DateTime(1980, 1, 2), FirstName = "John", HeightInFeet = 6.1M, IsActive = true, LastName = "Doe", MiddleName = "M" }; person.Phones.Add(new Phone { PhoneNumber = "1-222-333-4444" }); person.Phones.Add(new Phone { PhoneNumber = "1-333-4444-5555" }); using (var context = new Context()) { context.People.Add(person); context.SaveChanges(); }
方法二:改變Entity的狀態
using (var context = new Context()) { context.Entry(person2).State = EntityState.Added; context.SaveChanges(); }
EntityState:Added、Deleted、Detached(DbContex不追蹤Entity狀態)、Modified、Unchanged
3.更新數據
多種方法:
方法一:
using (var context = new Context()) { var person = context.People.Find(1); person.FirstName = "New Name"; context.SaveChanges(); }
方法二(建議使用)注意標記部分:
var person2 = new Person { PersonId = 1, BirthDate = new DateTime(1980, 1, 2), FirstName = "Jonathan", HeightInFeet = 6.1m, IsActive = true, LastName = "Smith", MiddleName = "M" }; person2.Phones.Add(new Phone { PhoneNumber = "updated 1", PhoneId = 1, PersonId = 1 }); person2.Phones.Add(new Phone { PhoneNumber = "updated 2", PhoneId = 2, PersonId = 1 }); using (var context = new Context()) { context.Entry(person2).State = EntityState.Modified; context.SaveChanges(); }
你會發現執行上面代碼只有Person數據更新了,Phone數據沒有更新,這是因為Insert和Update機制不一樣,Update時設置了Entity的EntityState,但是并沒有傳播到子數據的狀態,需要都上面程序做些修改
using (var context = new Context()) { context.Entry(person2).State = EntityState.Modified; foreach (var phone in person2.Phones) { context.Entry(phone).State = EntityState.Modified; } context.SaveChanges(); }
在開發Web程序時可以使用AsNoTracking來提高查詢性能
using (var context = new Context()) { var query = context.People.Include(p => p.Phones).AsNoTracking(); foreach (var person in query) { foreach (var phone in person.Phones) { } } }
- 使用Attach 會改變狀態為Unchanged,并開始追蹤Entity的狀態
var person3 = new Person { PersonId = 1, BirthDate = new DateTime(1980, 1, 2), FirstName = "Jonathan", HeightInFeet = 6.1m, IsActive = true, LastName = "Smith", MiddleName = "M" }; using (var context = new Context()) { context.People.Attach(person3); person3.LastName = "Updated"; context.SaveChanges(); }
上面代碼執行將僅僅只會更新LastName列。也可以用以下代碼替代Attach方法
context.Entry(person3).State = EntityState.Unchanged
4.刪除數據
- 方法一:先查詢出數據,再刪除(注意刪除子數據可以使用設置數據庫級聯刪除更方便)
using (var context = new Context()) { var toDelete = context.People.Find(personId); toDelete.Phones.ToList().ForEach(phone =>context.Phones.Remove(phone)); context.People.Remove(toDelete); context.SaveChanges(); }
- 方法二:使用改變狀態
var toDeleteByState = new Person { PersonId = personId }; toDeleteByState.Phones.Add(new Phone { PhoneId = phoneId1, PersonId = personId }); toDeleteByState.Phones.Add(new Phone { PhoneId = phoneId2, PersonId = personId }); using (var context = new Context()) { context.People.Attach(toDeleteByState); foreach (var phone in toDeleteByState.Phones.ToList()){context.Entry(phone).State = EntityState.Deleted;}context.Entry(toDeleteByState).State = EntityState.Deleted;context.SaveChanges(); }
5.查詢本地數據
當需要查詢的數據已經在內存中,而未提交到數據庫時對內存數據進行查詢
var localQuery = context.People.Local.Where(p => p.LastName.Contains("o")).ToList();
轉載于:https://www.cnblogs.com/zjmsky/p/4823847.html
總結
以上是生活随笔為你收集整理的Entity Framework学习三:查询、插入、更新和删除操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩托车趴赛多少钱
- 下一篇: ROS知识(4)----初级教程之常见问