zoukankan      html  css  js  c++  java
  • 在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本

      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 }
  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/creater/p/6322036.html
Copyright © 2011-2022 走看看