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 }
  • 相关阅读:
    Django 部署到Nginx
    Django 初识
    openstack操作之二 restful api
    openstack操作之一 命令行
    虚拟机创建流程中neutron代码分析(三)
    虚拟机创建流程中neutron代码分析(二)
    虚拟机创建流程中neutron代码分析(一)
    nova创建虚拟机源码分析系列之八 compute创建虚机
    nova创建虚拟机源码分析系列之七 传入参数转换成内部id
    Mysql之索引(六)
  • 原文地址:https://www.cnblogs.com/creater/p/6322036.html
Copyright © 2011-2022 走看看