在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本
生活随笔
收集整理的這篇文章主要介紹了
在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /// <summary>
2 /// 在數據倉儲的情況下進一步封裝數據庫基礎操作,此版本為異步版本 Created by ZhangQC 2016.08.17
3 /// </summary>
4 public static partial class EntityExtend
5 {
6 /// <summary>
7 /// 日志
8 /// </summary>
9 private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
10
11 #region 數據庫查詢
12
13 /// <summary>
14 /// 根據實體和條件獲取數據庫對應表 Created by ZhangQC 2016.08.17
15 /// </summary>
16 /// <typeparam name="T">泛指Entity</typeparam>
17 /// <param name="entity">數據庫實體</param>
18 /// <param name="where">查詢條件</param>
19 /// <returns></returns>
20 public static async Task<IEnumerable<T>> GetTableAsync<T>(this T entity, Expression<Func<T, bool>> where = null) where T : class
21 {
22 return await Task.Run(() =>
23 {
24 try
25 {
26 using (var db = new Repository<T>(new EFContext().ContextRead))
27 {
28 return @where != null ? db.DoQuery(@where).ToList() : db.DoQuery().ToList();
29 }
30 }
31 catch (Exception ex)
32 {
33 Log.ErrorFormat("根據實體和條件獲取數據庫對應表出錯:{0}", ex);
34 throw new ApplicationException("數據庫查詢失敗");
35 }
36 });
37 }
38
39 /// <summary>
40 /// 獲取表總數
41 /// </summary>
42 /// <typeparam name="T"></typeparam>
43 /// <param name="entity"></param>
44 /// <param name="where"></param>
45 /// <returns></returns>
46 public static async Task<int> GetCount<T>(this T entity, Expression<Func<T, bool>> where = null) where T : class
47 {
48 return await Task.Run(() =>
49 {
50 try
51 {
52 using (var db = new Repository<T>(new EFContext().ContextRead))
53 {
54 return @where != null ? db.DoQuery(@where).Count() : db.DoQuery().Count();
55 }
56 }
57 catch (Exception ex)
58 {
59 Log.ErrorFormat("獲取表總數量出錯:{0}", ex);
60 throw new ApplicationException("數據庫查詢失敗");
61 }
62 });
63 }
64
65
66 /// <summary>
67 /// 查詢數據,支持分頁,排序,過濾操作 倒敘
68 /// </summary>
69 /// <remarks>"此方法完全是為了兼容MVCPager定制,不屬于框架部分"</remarks>
70 /// <returns></returns>
71 public static async Task<PagedList<T>> GetTableBySortDescPageListAsync<T>(this T entity, int pageIndex, int pageSize, Expression<Func<T, bool>> where = null,
72 Expression<Func<T, object>> sort = null) where T : class
73 {
74 return await Task.Run(() =>
75 {
76 try
77 {
78 using (var db = new Repository<T>(new EFContext().ContextRead))
79 {
80 var table = @where != null
81 ? db.DoQuery(@where)
82 : db.DoQuery();
83 //如果排序為null,那么就按實體其中的一個主鍵進行排序
84 if (sort == null)
85 {
86 var entitySet = db.EntitySet<T>();
87 var keyCollections = entitySet.ElementType.KeyMembers;
88 if (keyCollections.FirstOrDefault() == null)
89 {
90 throw new ApplicationException("要查詢的表沒有發現主鍵!");
91 }
92 //自動生成主鍵排序字段
93 var entityKey = keyCollections.Aggregate(string.Empty, (a, b) => a + b + " desc,").TrimEnd(',');
94 //排序后的IQuaryable
95 var tableSortNull = table.OrderUsingSortExpression(entityKey);
96 return tableSortNull.ToPagedList(pageIndex, pageSize);
97 }
98 var tableSort = table.OrderBy(@sort);
99 return tableSort.ToPagedList(pageIndex, pageSize);
100 }
101 }
102 catch (Exception ex)
103 {
104 Log.ErrorFormat("對指定實體進行查詢,可以分頁,可以排序出錯:{0}", ex);
105 throw new ApplicationException("數據庫查詢失敗");
106 }
107 });
108 }
109
110 /// <summary>
111 /// 查詢數據,支持分頁,排序,過濾操作 正敘
112 /// </summary>
113 /// <remarks>"此方法完全是為了兼容MVCPager定制,不屬于框架部分"</remarks>
114 /// <returns></returns>
115 public static async Task<PagedList<T>> GetTableBySortAscPageListAsync<T>(this T entity, int pageIndex, int pageSize, Expression<Func<T, bool>> where = null,
116 Expression<Func<T, object>> sort = null) where T : class
117 {
118 return await Task.Run(() =>
119 {
120 try
121 {
122 using (var db = new Repository<T>(new EFContext().ContextRead))
123 {
124 var table = @where != null
125 ? db.DoQuery(@where)
126 : db.DoQuery();
127 //如果排序為null,那么就按實體其中的一個主鍵進行排序
128 if (sort == null)
129 {
130 var entitySet = db.EntitySet<T>();
131 var keyCollections = entitySet.ElementType.KeyMembers;
132 if (keyCollections.FirstOrDefault() == null)
133 {
134 throw new ApplicationException("要查詢的表沒有發現主鍵!");
135 }
136 //自動生成主鍵排序字段
137 var entityKey =
138 keyCollections.Aggregate(string.Empty, (a, b) => a + b + " asc,").TrimEnd(',');
139
140 #region 注釋代碼,警醒用
141
142 //主鍵類型
143 //var type = ((EdmProperty) keyCollections).PrimitiveType.ClrEquivalentType;
144 //創建實例
145 //var entityActivator = Activator.CreateInstance<T>();
146 ////創建類型實例
147 //var tKeyActivator = Activator.CreateInstance(type);
148
149 #endregion
150
151 //排序后的IQuaryable
152 var tableSortNull = table.OrderUsingSortExpression(entityKey);
153 return tableSortNull.ToPagedList(pageIndex, pageSize);
154 }
155 var tableSort = table.OrderBy(@sort);
156 return tableSort.ToPagedList(pageIndex, pageSize);
157 }
158 }
159 catch (Exception ex)
160 {
161 Log.ErrorFormat("對指定實體進行查詢,可以分頁,可以排序出錯:{0}", ex);
162 throw new ApplicationException("數據庫查詢失敗");
163 }
164 });
165 }
166
167
168
169 /// <summary>
170 /// 根據實體和條件獲取數據庫對應表 Created by ZhangQC 2016.08.17
171 /// </summary>
172 /// <typeparam name="T">泛指Entity</typeparam>
173 /// <param name="entity">數據庫實體</param>
174 /// <param name="where">查詢條件</param>
175 /// <returns></returns>
176 public static async Task<T> GetTableSingleAsync<T>(this T entity, Expression<Func<T, bool>> where = null) where T : class
177 {
178 return await Task.Run(() =>
179 {
180 try
181 {
182 using (var db = new Repository<T>(new EFContext().ContextRead))
183 {
184 return @where != null ? db.DoQuery(@where).FirstOrDefault() : db.DoQuery().FirstOrDefault();
185 }
186 }
187 catch (Exception ex)
188 {
189 Log.ErrorFormat("根據實體和條件獲取數據庫對應表出錯:{0}", ex);
190 throw new ApplicationException("數據庫查詢失敗");
191 }
192 });
193 }
194
195
196
197
198 /// <summary>
199 /// 根據實體和條件查詢數據庫對應表加排序功能 Created by ZhangQC 2016.08.17
200 /// </summary>
201 /// <typeparam name="T">泛指實體</typeparam>
202 /// <param name="entity">數據庫實體</param>
203 /// <param name="where">泛指查詢條件表達式</param>
204 /// <param name="sort">泛指排序表達式</param>
205 /// <returns></returns>
206 public static async Task<IEnumerable<T>> GetTableBySortAsync<T>(this T entity, Expression<Func<T, bool>> where = null,
207 Func<T, object> sort = null) where T : class
208 {
209 try
210 {
211 var table = await entity.GetTableAsync(@where);
212 return @sort != null ? table.OrderBy(@sort).ToList() : table.ToList();
213 }
214 catch (Exception ex)
215 {
216 Log.ErrorFormat("根據實體和條件查詢數據庫對應表加排序功能出錯:{0}", ex);
217 throw new ApplicationException("數據庫查詢失敗");
218 }
219 }
220
221
222 /// <summary>
223 /// 根據實體和條件查詢數據庫對應表加排序功能 Created by ZhangQC 2016.08.17
224 /// </summary>
225 /// <typeparam name="T">泛指實體</typeparam>
226 /// <param name="entity">數據庫實體</param>
227 /// <param name="where">泛指查詢條件表達式</param>
228 /// <param name="sort">泛指排序表達式</param>
229 /// <returns></returns>
230 public static async Task<IEnumerable<T>> GetTableBySortDescAsync<T>(this T entity, Expression<Func<T, bool>> where = null,
231 Func<T, object> sort = null) where T : class
232 {
233 try
234 {
235 var table = await entity.GetTableAsync(@where);
236 return @sort != null ? table.OrderByDescending(@sort).ToList() : table.ToList();
237 }
238 catch (Exception ex)
239 {
240 Log.ErrorFormat("根據實體和條件查詢數據庫對應表加排序功能出錯:{0}", ex);
241 throw new ApplicationException("數據庫查詢失敗");
242 }
243 }
244
245
246
247 /// <summary>
248 /// 對指定實體進行查詢,可以分頁,可以排序 Created by ZhangQC 2016.08.17
249 /// </summary>
250 /// <typeparam name="T">泛指實體</typeparam>
251 /// <param name="entity">數據庫實體</param>
252 /// <param name="skip">從多少條開始</param>
253 /// <param name="take">共取多少條</param>
254 /// <param name="where">泛指查詢條件表達式</param>
255 /// <param name="sort">泛指排序表達式</param>
256 /// <returns></returns>
257 public static async Task<IEnumerable<T>> GetTableBySoryPageAsync<T>(this T entity, int? skip, int? take, Expression<Func<T, bool>> where = null,
258 Expression<Func<T, object>> sort = null) where T : class
259 {
260 return await Task.Run(() =>
261 {
262 try
263 {
264 using (var db = new Repository<T>(new EFContext().ContextRead))
265 {
266 var table = @where != null
267 ? db.DoQuery(@where)
268 : db.DoQuery();
269 if (@skip == null || @take == null)
270 return @sort != null ? table.OrderBy(@sort).ToList() : table.ToList();
271 //如果排序為null,那么就按實體其中的一個主鍵進行排序
272 if (sort == null)
273 {
274 var entitySet = db.EntitySet<T>();
275 var keyCollections = entitySet.ElementType.KeyMembers;
276 if (keyCollections.FirstOrDefault() == null)
277 {
278 throw new ApplicationException("要查詢的表沒有發現主鍵!");
279 }
280 //自動生成主鍵排序字段
281 var entityKey = keyCollections.Aggregate(string.Empty, (a, b) => a + b + " asc,").TrimEnd(',');
282 //排序后的IQuaryable
283 var tableSortNull = table.OrderUsingSortExpression(entityKey);
284 return tableSortNull.Skip((int)@skip).Take((int)@take).ToList();
285 }
286 var tableSort = table.OrderBy(@sort);
287 return tableSort.Skip((int)@skip).Take((int)@take).ToList();
288 }
289 }
290 catch (Exception ex)
291 {
292 Log.ErrorFormat("對指定實體進行查詢,可以分頁,可以排序出錯:{0}", ex);
293 throw new ApplicationException("數據庫查詢失敗");
294 }
295 });
296 }
297 /// <summary>
298 /// 對指定實體進行查詢,可以分頁,可以排序 倒序 Created by ZhangQC 2016.08.17
299 /// </summary>
300 /// <typeparam name="T"></typeparam>
301 /// <param name="entity"></param>
302 /// <param name="skip"></param>
303 /// <param name="take"></param>
304 /// <param name="where"></param>
305 /// <param name="sort"></param>
306 /// <returns></returns>
307 public static async Task<IEnumerable<T>> GetTableBySoryDescPageAsync<T>(this T entity, int? skip, int? take, Expression<Func<T, bool>> where = null,
308 Expression<Func<T, object>> sort = null) where T : class
309 {
310 return await Task.Run(() =>
311 {
312 try
313 {
314 using (var db = new Repository<T>(new EFContext().ContextRead))
315 {
316 var table = @where != null
317 ? db.DoQuery(@where)
318 : db.DoQuery();
319 if (@skip == null || @take == null)
320 return @sort != null ? table.OrderByDescending(@sort).ToList() : table.ToList();
321 //如果排序為null,那么就按實體其中的一個主鍵進行排序
322 if (sort == null)
323 {
324 var entitySet = db.EntitySet<T>();
325 var keyCollections = entitySet.ElementType.KeyMembers;
326 if (keyCollections.FirstOrDefault() == null)
327 {
328 throw new ApplicationException("要查詢的表沒有發現主鍵!");
329 }
330 //自動生成主鍵排序字段
331 var entityKey = keyCollections.Aggregate(string.Empty, (a, b) => a + b + " desc,").TrimEnd(',');
332 //排序后的IQuaryable
333 var tableSortNull = table.OrderUsingSortExpression(entityKey);
334 return tableSortNull.Skip((int)@skip).Take((int)@take).ToList();
335 }
336 var tableSort = table.OrderBy(@sort);
337 return tableSort.Skip((int)@skip).Take((int)@take).ToList();
338 }
339 }
340 catch (Exception ex)
341 {
342 Log.ErrorFormat("對指定實體進行查詢,可以分頁,可以排序出錯:{0}", ex);
343 throw new ApplicationException("數據庫查詢失敗");
344 }
345 });
346 }
347
348 #endregion
349
350 #region 保存數據
351 /// <summary>
352 /// 單個實體保存數據庫時使用 Created by ZhangQC 2016.08.17
353 /// </summary>
354 /// <typeparam name="T"></typeparam>
355 /// <param name="entity"></param>
356 /// <returns></returns>
357 public static async Task<bool> SaveAsync<T>(this T entity) where T : class
358 {
359 return await Task.Run(() =>
360 {
361 try
362 {
363 using (var db = new Repository<T>(new EFContext().ContextRead))
364 {
365 db.Add(entity);
366 return db.Save() != 0;
367 }
368 }
369 catch (Exception ex)
370 {
371 Log.ErrorFormat("單個實體保存數據庫時使用出錯:{0}", ex);
372 return false;
373 }
374 });
375 }
376
377
378
379 /// <summary>
380 /// 實體集合新增或者更新數據庫時使用 Created by ZhangQC 2016.08.17
381 /// </summary>
382 /// <typeparam name="T"></typeparam>
383 /// <param name="entityList"></param>
384 /// <returns></returns>
385 public static async Task<bool> SaveAsync<T>(this List<T> entityList) where T : class
386 {
387 return await Task.Run(() =>
388 {
389 try
390 {
391 using (var db = new Repository<T>(new EFContext().ContextRead))
392 {
393 db.AddOrUpdate(entityList.ToArray());
394 db.Save();
395 return true;
396 }
397 }
398 catch (Exception ex)
399 {
400 Log.ErrorFormat("實體集合新增或者更新數據庫時使用:{0}", ex);
401 return false;
402 }
403 });
404 }
405 #endregion
406
407
408 #region 更新操作
409 /// <summary>
410 /// 更新實體數據(批量可以使用Sava(List《T》)方法) Created by ZhangQC 2016.08.17
411 /// </summary>
412 /// <typeparam name="T"></typeparam>
413 /// <param name="entity"></param>
414 /// <returns></returns>
415 public static async Task<bool> UpdateAsync<T>(this T entity) where T : class
416 {
417 return await Task.Run(() =>
418 {
419 try
420 {
421 using (var db = new Repository<T>(new EFContext().ContextRead))
422 {
423 db.Update(entity);
424 return db.Save() != 0;
425 }
426 }
427 catch (Exception ex)
428 {
429 Log.ErrorFormat("更新實體數據(批量可以使用Sava(List《T》)方法)出錯:{0}", ex);
430 return false;
431 }
432 });
433 }
434 #endregion
435
436 #region 刪除操作
437 /// <summary>
438 /// 刪除操作 Created by ZhangQC 2016.08.17
439 /// </summary>
440 /// <typeparam name="T"></typeparam>
441 /// <param name="entity"></param>
442 /// <returns></returns>
443 public static async Task<bool> DeleteAsync<T>(this T entity) where T : class
444 {
445 return await Task.Run(() =>
446 {
447 try
448 {
449 using (var db = new Repository<T>(new EFContext().ContextRead))
450 {
451 db.Delete(entity);
452 return db.Save() != 0;
453 }
454 }
455 catch (Exception ex)
456 {
457 Log.ErrorFormat("出錯:{0}", ex);
458 return false;
459 }
460 });
461 }
462
463 /// <summary>
464 /// 刪除操作 Created by ZhangQC 2016.08.17
465 /// </summary>
466 /// <typeparam name="T"></typeparam>
467 /// <param name="entity"></param>
468 /// <returns></returns>
469 public static async Task<bool> DeleteAsync<T>(this IQueryable<T> entity) where T : class
470 {
471 return await Task.Run(() =>
472 {
473 try
474 {
475 using (var db = new Repository<T>(new EFContext().ContextRead))
476 {
477 db.Delete(entity);
478 return db.Save() != 0;
479 }
480 }
481 catch (Exception ex)
482 {
483 Log.ErrorFormat("出錯:{0}", ex);
484 return false;
485 }
486 });
487 }
488
489
490 /// <summary>
491 /// 批量刪除操作 Created by ZhangQC 2016.08.17
492 /// </summary>
493 /// <typeparam name="T"></typeparam>
494 /// <param name="entity"></param>
495 /// <returns></returns>
496 public static async Task<bool> DeleteAsync<T>(this IEnumerable<T> entity) where T : class
497 {
498 return await Task.Run(() =>
499 {
500 try
501 {
502 using (var db = new Repository<T>(new EFContext().ContextRead))
503 {
504 db.Delete(entity);
505 return db.Save() != 0;
506 }
507 }
508 catch (Exception ex)
509 {
510 Log.ErrorFormat("出錯:{0}", ex);
511 return false;
512 }
513 });
514 }
515
516
517 #endregion
518 }
?
轉載于:https://www.cnblogs.com/creater/p/6322036.html
總結
以上是生活随笔為你收集整理的在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数组复制
- 下一篇: Mysql CURD复习(数据库、表、数