目錄
一.EF修改和刪除的多種方法
二.標准查詢where
三.include
四.skip take
五.反射獲取實例屬性
六.EF DLL數據訪問幫助類
一.EF修改和刪除的多種方法
方法1:官方推薦 先查詢在修改 或者刪除
1 var student = db.Students.FirstOrDefault(t => t.Id == Mid);
2 student.Name = "修改后";//修改值數據
3 db.SaveChanges();//保存
4 db.Students.Remove(student);//移除對象
5 db.SaveChanges();//保存
方法2:先附加到ef實體對象 然后在移除
1 Students s = new Students();
2 s.Id = int.Parse(id);
3 db.Students.Attach(s);//將實體附加到 上下文中 ;
4 db.Students.Remove(s);
5 if (db.SaveChanges() >= 1)
6 {
7 //成功
8 }
方法3:添加到ef實體對象 然后標記刪除
1 Students s = new Students();
2 s.Id = int.Parse(id);
3 db.Entry<Students>(s).State = System.Data.EntityState.Deleted;//標記刪除 4 int num = db.SaveChanges();
方法4:修改實體
1 //這里需要關閉驗證 不然會報錯
2 db.Configuration.ValidateOnSaveEnabled = false;
3 DbEntityEntry dbS = db.Entry<Students>(s);
4 dbS.State = System.Data.EntityState.Unchanged; //清楚所有字段標記
5 dbS.Property("Gender").IsModified = true;//標記修改字段
6 int num = db.SaveChanges();
7 db.Configuration.ValidateOnSaveEnabled = true;//打開驗證
8 if (num >= 1)
9 {
10 //修改成功
11 }
二.標准查詢where 在不同場景 實現方法不一樣
1 //場景1:ef的數據集 使用where 是在 IQueryable 的擴展方法
2 //場景2:List集合的數據集 使用where 是在 IEnumerable 的擴展方法
三.include
場景1:自動 連接查詢【無Include】
1 //1.自動 連接查詢【無Include】
2 var stu1 = db.Students.Where(t => t.Classes.CName == "zha");
3 var cname = stu1.FirstOrDefault();
1 SELECT TOP (1)
2 [Extent1].[Id] AS [Id],
3 [Extent1].[CId] AS [CId],
4 [Extent1].[Name] AS [Name],
5 [Extent1].[Gender] AS [Gender],
6 [Extent1].[IsDel] AS [IsDel],
7 [Extent1].[AddTime] AS [AddTime]
8 FROM [dbo].[Students] AS [Extent1]
9 INNER JOIN [dbo].[Classes] AS [Extent2] ON [Extent1].[CId] = [Extent2].[CID]
10 WHERE 'zha' = [Extent2].[CName]
場景2:手動 內連接查詢【有Include】
1 //2手動 內連接查詢【有Include】
2 var stu2 = db.Students.Include("Classes").Where(t => t.Id == 11);
3 var ccc = stu2.FirstOrDefault().Classes.CName;
1 SELECT
2 [Limit1].[Id] AS [Id],
3 [Limit1].[CId] AS [CId],
4 [Limit1].[Name] AS [Name],
5 [Limit1].[Gender] AS [Gender],
6 [Limit1].[IsDel] AS [IsDel],
7 [Limit1].[AddTime] AS [AddTime],
8 [Extent2].[CID] AS [CId1],
9 [Extent2].[CName] AS [CName],
10 [Extent2].[CCount] AS [CCount],
11 [Extent2].[CImg] AS [CImg],
12 [Extent2].[CIsDel] AS [CIsDel],
13 [Extent2].[CAddTime] AS [CAddTime]
14 FROM (SELECT TOP (1) [Extent1].[Id] AS [Id], [Extent1].[CId] AS [CId], [Extent1].[Name] AS [Name], [Extent1].[Gender] AS [Gender], [Extent1].[IsDel] AS [IsDel], [Extent1].[AddTime] AS [AddTime]
15 FROM [dbo].[Students] AS [Extent1]
16 WHERE 11 = [Extent1].[Id] ) AS [Limit1]
17 LEFT OUTER JOIN [dbo].[Classes] AS [Extent2] ON [Limit1].[CId] = [Extent2].[CID]
場景3:無連接查詢 分兩次sql查詢【無Include】
1 //3.無連接查詢 分兩次sql查詢【無Include】
2 var stucc = db.Students.Where(t => t.Id == 11);
3 var zz = stucc.FirstOrDefault().Classes.CName;
1 SELECT TOP (1)
2 [Extent1].[Id] AS [Id],
3 [Extent1].[CId] AS [CId],
4 [Extent1].[Name] AS [Name],
5 [Extent1].[Gender] AS [Gender],
6 [Extent1].[IsDel] AS [IsDel],
7 [Extent1].[AddTime] AS [AddTime]
8 FROM [dbo].[Students] AS [Extent1]
9 WHERE 11 = [Extent1].[Id];
10
11 SELECT
12 [Extent1].[CID] AS [CID],
13 [Extent1].[CName] AS [CName],
14 [Extent1].[CCount] AS [CCount],
15 [Extent1].[CImg] AS [CImg],
16 [Extent1].[CIsDel] AS [CIsDel],
17 [Extent1].[CAddTime] AS [CAddTime]
18 FROM [dbo].[Classes] AS [Extent1]
19 WHERE [Extent1].[CID] = @EntityKeyValue1
四.skip take
1 //Skip 跳過序列中指定數量的元素,然后返回剩余的元素。
2 //Take 從序列的開頭返回指定數量的連續元素。
3 //根據這兩個方法可以 實現 分頁效果
五.反射獲取實例屬性
1 //利用反射 獲取 類 對象 的所有公共 屬性 默認是[GetProperties(BindingFlags.Instance | BindingFlags.Public)]
2 var listPro = typeof(Students).GetProperties().ToList();
3 object obj1 = new object();
4 object obj2 = new object();
5 listPro.ForEach(l =>
6 {
7 var newValue = l.GetValue(obj1); //獲得某個對象的屬性值
8 l.SetValue(obj2, newValue);//修改一個對象的屬性 值
9 });
六.EF DLL數據訪問幫助 父類
1 using _00EFModel;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Linq.Expressions;
6 using System.Reflection;
7 using System.Text;
8 using System.Threading.Tasks;
9
10 namespace _00EFDLL
11 {
12 /// <summary>
13 /// 數據訪問 父類
14 /// </summary>
15 public class BaseDLL<Tclass> where Tclass : class,new()
16 {
17 /// <summary>
18 /// 數據訪問上下文
19 /// </summary>
20 _00EFModel.Entities db = new _00EFModel.Entities();
21
22 #region 1.0添加數據 + Add(Tclass model)
23 /// <summary>
24 /// 1.0添加數據
25 /// </summary>
26 /// <param name="model"></param>
27 public void Add(Tclass model)
28 {
29 db.Set<Tclass>().Add(model);
30 }
31 #endregion
32
33 #region 2.0 刪除方法1 刪除給定的對象 +Del(Tclass model)
34 /// <summary>
35 /// 2.0 刪除方法1 刪除給定的對象
36 /// </summary>
37 /// <param name="model"></param>
38 public void Del(Tclass model)
39 {
40 //將實體 添加到上下文
41 db.Set<Tclass>().Attach(model);
42 //把實體 標記為刪除
43 db.Set<Tclass>().Remove(model);
44 }
45 #endregion
46
47 #region 2.1 刪除方法2 根據條件刪除對象 +Del(Expression<Func<Tclass, bool>> delWhere)
48 /// <summary>
49 /// 2.1 刪除方法2 根據條件刪除對象
50 /// </summary>
51 /// <param name="delWhere"></param>
52 public void Del(Expression<Func<Tclass, bool>> delWhere)
53 {
54 //查詢所有滿足條件的實體對象
55 var modelS = db.Set<Tclass>().Where(delWhere).ToList();
56 modelS.ForEach(m =>
57 {
58 //附加到 上下文
59 db.Set<Tclass>().Attach(m);
60 //標記為 刪除狀態
61 db.Set<Tclass>().Remove(m);
62 });
63 }
64 #endregion
65
66 #region 3.0 修改方法1 修改某個實體的 某些屬性 +Up(Tclass model, params string[] strparams)
67 /// <summary>
68 /// 3.0 修改方法1 修改某個實體的 某些屬性(根據id修改)【*用這個需要注意關閉檢查】
69 /// </summary>
70 /// <param name="model"></param>
71 /// <param name="strparams">可變參數</param>
72 public int Up(Tclass model, params string[] strparams)
73 {
74 //關閉檢查
75 db.Configuration.ValidateOnSaveEnabled = false;
76 //附加到上下文
77 var m = db.Entry<Tclass>(model);
78 //把全部屬性標記為 沒有修改
79 m.State = System.Data.Entity.EntityState.Unchanged;
80 for (int i = 0; i < strparams.Length; i++)
81 {
82 //標記要修改的屬性
83 m.Property(strparams[i]).IsModified = true;
84 }
85 int num = db.SaveChanges();
86 //打開檢查
87 db.Configuration.ValidateOnSaveEnabled = true;
88 return num;
89 }
90 #endregion
91
92 #region 3.1 修改方法2 根據條件 修改指定的 屬性 值 +Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
93 /// <summary>
94 /// 3.1 修改方法2 根據條件 修改指定的 屬性 值
95 /// </summary>
96 /// <param name="upWhere"></param>
97 /// <param name="model"></param>
98 /// <param name="strparame"></param>
99 public void Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
100 {
101 //查詢出滿足條件的所有實體
102 var modelS = db.Set<Tclass>().Where(upWhere).ToList();
103 //利用反射 獲取 類 對象 的所有公共 屬性 默認是[GetProperties(BindingFlags.Instance | BindingFlags.Public)]
104 var listPro = typeof(Tclass).GetProperties().ToList();
105 // 屬性對象 鍵值對
106 List<PropertyInfo> dic = new List<PropertyInfo>();
107 listPro.ForEach(l =>
108 {
109 for (int i = 0; i < strparame.Length; i++)
110 {
111 //循環 判斷 添加 需要修改的 屬性對象
112 if (l.Name == strparame[i].Trim())
113 {
114 dic.Add(l);
115 break;
116 }
117 }
118 });
119
120 if (dic.Count > 0)//判斷 屬性對象集合 是否 有 數據
121 {
122 foreach (var property in dic)
123 {
124 //取 傳過來的對象 里面的值
125 var newValue = property.GetValue(model);
126 foreach (var mymodel in modelS)
127 {
128 //修改到 對象集合
129 property.SetValue(mymodel, newValue);
130 }
131 }
132 }
133 }
134 #endregion
135
136 #region 4.0 查詢方法 +GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
137 /// <summary>
138 /// 4.0 查詢方法
139 /// </summary>
140 /// <typeparam name="Tkey"></typeparam>
141 /// <param name="strWhere">查詢條件</param>
142 /// <param name="strOrederBy">排序條件</param>
143 /// <param name="order">是否升序</param>
144 /// <returns></returns>
145 public List<Tclass> GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
146 {
147 var t = db.Set<Tclass>().Where(strWhere);
148 if (strOrederBy != null)
149 {
150 if (order)
151 t = t.OrderBy(strOrederBy);
152 else
153 t = t.OrderByDescending(strOrederBy);
154 }
155 return t.ToList();
156 }
157 #endregion
158
159 #region 4.1 查詢方法2 分頁查詢 +GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
160 /// <summary>
161 /// 4.1 查詢方法2 分頁查詢
162 /// </summary>
163 /// <typeparam name="Tkey"></typeparam>
164 /// <param name="indexPage">頁碼</param>
165 /// <param name="sizePage">頁容量</param>
166 /// <param name="strWhere">查詢條件</param>
167 /// <param name="strOrederBy">排序字段</param>
168 /// <param name="order">是否升序</param>
169 /// <returns></returns>
170 public List<Tclass> GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
171 {
172 var t = db.Set<Tclass>().Where(strWhere);
173 if (strOrederBy != null)
174 {
175 if (order)
176 t = t.OrderBy(strOrederBy);
177 else
178 t = t.OrderByDescending(strOrederBy);
179 }
180 return t.Skip((indexPage - 1) * sizePage).Take(sizePage).ToList();
181 }
182 #endregion
183
184 #region 提交 +save()
185 /// <summary>
186 /// 提交
187 /// </summary>
188 /// <returns></returns>
189 public int save()
190 {
191 return db.SaveChanges();
192 }
193 #endregion
194 }
195 }
View Code