在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本

  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 }

 

posted @ 2017-01-20 10:20  小小的菜鸟程序员  阅读(303)  评论(0编辑  收藏  举报