Repository.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. using Mapster;
  2. using SqlSugar;
  3. using SqlSugar.IOC;
  4. using System.Collections;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. using WMS.BZModels;
  8. using WMS.BZServices;
  9. using WMS.Info;
  10. namespace WMS.BZSqlSugar
  11. {
  12. public class Repository<T> : SimpleClient<T> where T : BaseEntityModel, new()
  13. {
  14. public Repository(ISqlSugarClient context = null)
  15. {
  16. //通过特性拿到ConfigId
  17. var configId = typeof(T).GetCustomAttribute<TenantAttribute>()?.configId;
  18. if (configId != null)
  19. {
  20. Context = DbScoped.SugarScope.GetConnectionScope(configId);//根据类传入的ConfigId自动选择
  21. }
  22. else
  23. {
  24. Context = context ?? DbScoped.SugarScope.GetConnectionScope("hj");//没有默认db0
  25. }
  26. }
  27. //public Repository()
  28. //{
  29. // //固定数据库用法
  30. // Context = SqlSugarHelper.Db.GetConnectionScopeWithAttr<T>();
  31. //}
  32. public T InsertReturnEntity(T t)
  33. {
  34. //t = CheckId.InitId<T>(t);
  35. return Context.Insertable(t).ExecuteReturnEntity();
  36. }
  37. /// <summary>
  38. /// 该方法默认不更新AddWho,AddTime
  39. /// </summary>
  40. /// <param name="entity"></param>
  41. /// <returns></returns>
  42. public bool UpdateEntity(T entity)
  43. {
  44. return Context.Updateable(entity).IgnoreColumns(new string[] { "AddWho", "AddTime" }).ExecuteCommand() > 0;
  45. }
  46. public bool UpdateModelColumns(Expression<Func<T, T>> Columns, Expression<Func<T, bool>> WhereExpression)
  47. {
  48. return Update(Columns, WhereExpression);
  49. }
  50. public T GetModelByExpression(Expression<Func<T, bool>> WhereExpression)
  51. {
  52. return GetSingle(WhereExpression);
  53. }
  54. //public ISugarQueryable<T> Queryable()
  55. //{
  56. // return Context.Queryable<T>();
  57. //}
  58. #region query
  59. public bool Any(Expression<Func<T, bool>> expression)
  60. {
  61. return Context.Queryable<T>().Where(expression).Any();
  62. }
  63. public ISugarQueryable<T> Queryable()
  64. {
  65. return Context.Queryable<T>();
  66. }
  67. public List<T> SqlQueryToList(string sql, object obj = null)
  68. {
  69. return Context.Ado.SqlQuery<T>(sql, obj);
  70. }
  71. /// <summary>
  72. /// 根据主值查询单条数据
  73. /// </summary>
  74. /// <param name="pkValue">主键值</param>
  75. /// <returns>泛型实体</returns>
  76. public T GetId(object pkValue)
  77. {
  78. return Context.Queryable<T>().InSingle(pkValue);
  79. }
  80. /// <summary>
  81. /// 根据条件查询分页数据
  82. /// </summary>
  83. /// <param name="where"></param>
  84. /// <param name="parm"></param>
  85. /// <returns></returns>
  86. public PagedInfo<T> GetPages(Expression<Func<T, bool>> where, PagerInfo parm)
  87. {
  88. var source = Context.Queryable<T>().Where(where);
  89. return source.ToPage(parm);
  90. }
  91. /// <summary>
  92. /// 分页获取数据
  93. /// </summary>
  94. /// <param name="where">条件表达式</param>
  95. /// <param name="parm"></param>
  96. /// <param name="order"></param>
  97. /// <param name="orderEnum"></param>
  98. /// <returns></returns>
  99. public PagedInfo<T> GetPages(Expression<Func<T, bool>> where, PagerInfo parm, Expression<Func<T, object>> order, OrderByType orderEnum = OrderByType.Asc)
  100. {
  101. var source = Context
  102. .Queryable<T>()
  103. .Where(where)
  104. .OrderByIF(orderEnum == OrderByType.Asc, order, OrderByType.Asc)
  105. .OrderByIF(orderEnum == OrderByType.Desc, order, OrderByType.Desc);
  106. return source.ToPage(parm);
  107. }
  108. public PagedInfo<T> GetPages(Expression<Func<T, bool>> where, PagerInfo parm, Expression<Func<T, object>> order, string orderByType)
  109. {
  110. return GetPages(where, parm, order, orderByType == "desc" ? OrderByType.Desc : OrderByType.Asc);
  111. }
  112. /// <summary>
  113. /// 查询所有数据(无分页,请慎用)
  114. /// </summary>
  115. /// <returns></returns>
  116. public List<T> GetAll(bool useCache = false, int cacheSecond = 3600)
  117. {
  118. return Context.Queryable<T>().WithCacheIF(useCache, cacheSecond).ToList();
  119. }
  120. #endregion query
  121. #region add
  122. /// <summary>
  123. /// 插入实体
  124. /// </summary>
  125. /// <param name="t"></param>
  126. /// <returns></returns>
  127. public int Add(T t, bool ignoreNull = true)
  128. {
  129. return Context.Insertable(t).IgnoreColumns(ignoreNullColumn: ignoreNull).ExecuteCommand();
  130. }
  131. public int Insert(List<T> t)
  132. {
  133. return Context.Insertable(t).ExecuteCommand();
  134. }
  135. public int Insert(T parm, Expression<Func<T, object>> iClumns = null, bool ignoreNull = true)
  136. {
  137. return Context.Insertable(parm).InsertColumns(iClumns).IgnoreColumns(ignoreNullColumn: ignoreNull).ExecuteCommand();
  138. }
  139. public IInsertable<T> Insertable(T t)
  140. {
  141. return Context.Insertable<T>(t);
  142. }
  143. #endregion add
  144. #region delete
  145. public IDeleteable<T> Deleteable()
  146. {
  147. return Context.Deleteable<T>();
  148. }
  149. /// <summary>
  150. /// 批量删除
  151. /// </summary>
  152. /// <param name="obj"></param>
  153. /// <returns></returns>
  154. public int Delete(object[] obj)
  155. {
  156. return Context.Deleteable<T>().In(obj).ExecuteCommand();
  157. }
  158. public int Delete(object id)
  159. {
  160. return Context.Deleteable<T>(id).ExecuteCommand();
  161. }
  162. public int DeleteTable()
  163. {
  164. return Context.Deleteable<T>().ExecuteCommand();
  165. }
  166. public bool Truncate()
  167. {
  168. return Context.DbMaintenance.TruncateTable<T>();
  169. }
  170. #endregion delete
  171. public DbResult<bool> LoginUseTran(Action action)
  172. {
  173. try
  174. {
  175. var result = Context.Ado.UseTran(() => action(), error =>
  176. {
  177. var err = error as BZSysExCore;
  178. Context.Ado.RollbackTran();
  179. throw new BZSysExCore(err!=null ?err.SysExType:0, error.Message);
  180. });
  181. return result;
  182. }
  183. catch (Exception ex)
  184. {
  185. Context.Ado.RollbackTran();
  186. Console.WriteLine(ex.Message);
  187. throw;
  188. }
  189. }
  190. public DbResult<bool> UseTranAction(Action action)
  191. {
  192. var result = Context.Ado.UseTran(() => action(), error =>
  193. {
  194. var err = error as BZSysExCore;
  195. Context.Ado.RollbackTran();
  196. throw new BZSysExCore(err != null ? err.SysExType : 0, error.Message);
  197. });
  198. return result;
  199. }
  200. public DbResult<bool> UseTran(Action action)
  201. {
  202. try
  203. {
  204. var result = Context.Ado.UseTran(() => action());
  205. return result;
  206. }
  207. catch (Exception ex)
  208. {
  209. Context.Ado.RollbackTran();
  210. Console.WriteLine(ex.Message);
  211. throw;
  212. }
  213. }
  214. public IStorageable<T> Storageable(T t)
  215. {
  216. return Context.Storageable<T>(t);
  217. }
  218. public IStorageable<T> Storageable(List<T> t)
  219. {
  220. return Context.Storageable(t);
  221. }
  222. /// <summary>
  223. ///
  224. /// </summary>
  225. /// <param name="client"></param>
  226. /// <param name="action">增删改查方法</param>
  227. /// <returns></returns>
  228. public DbResult<bool> UseTran(SqlSugarClient client, Action action)
  229. {
  230. try
  231. {
  232. var result = client.AsTenant().UseTran(() => action());
  233. return result;
  234. }
  235. catch (Exception ex)
  236. {
  237. client.AsTenant().RollbackTran();
  238. Console.WriteLine(ex.Message);
  239. throw;
  240. }
  241. }
  242. /// <summary>
  243. /// 使用事务
  244. /// </summary>
  245. /// <param name="action"></param>
  246. /// <returns></returns>
  247. public bool UseTran2(Action action)
  248. {
  249. var result = Context.Ado.UseTran(() => action());
  250. return result.IsSuccess;
  251. }
  252. }
  253. /// <summary>
  254. /// 分页查询扩展
  255. /// </summary>
  256. public static class QueryableExtension
  257. {
  258. /// <summary>
  259. /// 读取列表
  260. /// </summary>
  261. /// <typeparam name="T"></typeparam>
  262. /// <param name="source">查询表单式</param>
  263. /// <param name="parm">分页参数</param>
  264. /// <returns></returns>
  265. public static PagedInfo<T> ToPage<T>(this ISugarQueryable<T> source, Pagination parm)
  266. {
  267. var page = new PagedInfo<T>();
  268. var total = 0;
  269. page.PageSize = parm.rows;
  270. page.PageIndex = parm.page;
  271. parm.sidx = parm.sidx.Replace("DESC", "").Replace("ASC", "");
  272. page.Result = source.OrderByIF(!parm.sidx.IsEmpty(), $"{parm.sidx.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.sord) && parm.sord.ToLower().Contains("desc") ? "desc" : "asc")}")
  273. .ToPageList(parm.page, parm.rows, ref total);
  274. page.TotalNum = total;
  275. return page;
  276. }
  277. /// <summary>
  278. /// 转指定实体类Dto
  279. /// </summary>
  280. /// <typeparam name="T"></typeparam>
  281. /// <typeparam name="T2"></typeparam>
  282. /// <param name="source"></param>
  283. /// <param name="parm"></param>
  284. /// <returns></returns>
  285. public static PagedInfo<T2> ToPage<T, T2>(this ISugarQueryable<T> source, Pagination parm)
  286. {
  287. var page = new PagedInfo<T2>();
  288. var total = 0;
  289. page.PageSize = parm.rows;
  290. page.PageIndex = parm.page;
  291. parm.sidx = parm.sidx.Replace("DESC", "").Replace("ASC", "");
  292. var result = source
  293. .OrderByIF(!parm.sidx.IsEmpty(), $"{parm.sidx.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.sord) && parm.sord.ToLower().Contains("desc") ? "desc" : "asc")}")
  294. .ToPageList(parm.page, parm.rows, ref total);
  295. page.TotalNum = total;
  296. page.Result = result.Adapt<List<T2>>();
  297. return page;
  298. }
  299. /// <summary>
  300. /// 读取列表
  301. /// </summary>
  302. /// <typeparam name="T"></typeparam>
  303. /// <param name="source">查询表单式</param>
  304. /// <param name="parm">分页参数</param>
  305. /// <returns></returns>
  306. public static PagedInfo<T> ToPage<T>(this ISugarQueryable<T> source, PagerInfo parm)
  307. {
  308. var page = new PagedInfo<T>();
  309. var total = 0;
  310. page.PageSize = parm.PageSize;
  311. page.PageIndex = parm.PageNum;
  312. parm.Sort = parm.Sort.Replace("DESC", "").Replace("ASC", "");
  313. page.Result = source.OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.ToLower().Contains("desc") ? "desc" : "asc")}")
  314. .ToPageList(parm.PageNum, parm.PageSize, ref total);
  315. page.TotalNum = total;
  316. return page;
  317. }
  318. /// <summary>
  319. /// 转指定实体类Dto
  320. /// </summary>
  321. /// <typeparam name="T"></typeparam>
  322. /// <typeparam name="T2"></typeparam>
  323. /// <param name="source"></param>
  324. /// <param name="parm"></param>
  325. /// <returns></returns>
  326. public static PagedInfo<T2> ToPage<T, T2>(this ISugarQueryable<T> source, PagerInfo parm)
  327. {
  328. var page = new PagedInfo<T2>();
  329. var total = 0;
  330. page.PageSize = parm.PageSize;
  331. page.PageIndex = parm.PageNum;
  332. parm.Sort = parm.Sort.Replace("DESC", "").Replace("ASC", "");
  333. var result = source
  334. .OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.ToLower().Contains("desc") ? "desc" : "asc")}")
  335. .ToPageList(parm.PageNum, parm.PageSize, ref total);
  336. page.TotalNum = total;
  337. page.Result = result.Adapt<List<T2>>();
  338. return page;
  339. }
  340. }
  341. public static partial class Extensions
  342. {
  343. public static bool IsEmpty(this object value)
  344. {
  345. if (value != null && !string.IsNullOrEmpty(value.ParseToString()))
  346. {
  347. return false;
  348. }
  349. else
  350. {
  351. return true;
  352. }
  353. }
  354. public static bool IsNotEmpty(this object value)
  355. {
  356. return !IsEmpty(value);
  357. }
  358. public static bool IsNullOrZero(this object value)
  359. {
  360. if (value == null || value.ParseToString().Trim() == "0")
  361. {
  362. return true;
  363. }
  364. else
  365. {
  366. return false;
  367. }
  368. }
  369. //public static bool IsAjaxRequest(this HttpRequest request)
  370. //{
  371. // if (request == null)
  372. // throw new ArgumentNullException("request");
  373. // if (request.Headers != null)
  374. // return request.Headers["X-Requested-With"] == "XMLHttpRequest";
  375. // return false;
  376. //}
  377. }
  378. public static partial class Extensions
  379. {
  380. #region 转换为long
  381. /// <summary>
  382. /// 将object转换为long,若转换失败,则返回0。不抛出异常。
  383. /// </summary>
  384. /// <param name="str"></param>
  385. /// <returns></returns>
  386. public static long ParseToLong(this object obj)
  387. {
  388. try
  389. {
  390. return long.Parse(obj.ToString());
  391. }
  392. catch
  393. {
  394. return 0L;
  395. }
  396. }
  397. /// <summary>
  398. /// 将object转换为long,若转换失败,则返回指定值。不抛出异常。
  399. /// </summary>
  400. /// <param name="str"></param>
  401. /// <param name="defaultValue"></param>
  402. /// <returns></returns>
  403. public static long ParseToLong(this string str, long defaultValue)
  404. {
  405. try
  406. {
  407. return long.Parse(str);
  408. }
  409. catch
  410. {
  411. return defaultValue;
  412. }
  413. }
  414. #endregion
  415. #region 转换为int
  416. /// <summary>
  417. /// 将object转换为int,若转换失败,则返回0。不抛出异常。
  418. /// </summary>
  419. /// <param name="str"></param>
  420. /// <returns></returns>
  421. public static int ParseToInt(this object str)
  422. {
  423. try
  424. {
  425. return Convert.ToInt32(str);
  426. }
  427. catch
  428. {
  429. return 0;
  430. }
  431. }
  432. /// <summary>
  433. /// 将object转换为int,若转换失败,则返回指定值。不抛出异常。
  434. /// null返回默认值
  435. /// </summary>
  436. /// <param name="str"></param>
  437. /// <param name="defaultValue"></param>
  438. /// <returns></returns>
  439. public static int ParseToInt(this object str, int defaultValue)
  440. {
  441. if (str == null)
  442. {
  443. return defaultValue;
  444. }
  445. try
  446. {
  447. return Convert.ToInt32(str);
  448. }
  449. catch
  450. {
  451. return defaultValue;
  452. }
  453. }
  454. #endregion
  455. #region 转换为short
  456. /// <summary>
  457. /// 将object转换为short,若转换失败,则返回0。不抛出异常。
  458. /// </summary>
  459. /// <param name="str"></param>
  460. /// <returns></returns>
  461. public static short ParseToShort(this object obj)
  462. {
  463. try
  464. {
  465. return short.Parse(obj.ToString());
  466. }
  467. catch
  468. {
  469. return 0;
  470. }
  471. }
  472. /// <summary>
  473. /// 将object转换为short,若转换失败,则返回指定值。不抛出异常。
  474. /// </summary>
  475. /// <param name="str"></param>
  476. /// <returns></returns>
  477. public static short ParseToShort(this object str, short defaultValue)
  478. {
  479. try
  480. {
  481. return short.Parse(str.ToString());
  482. }
  483. catch
  484. {
  485. return defaultValue;
  486. }
  487. }
  488. #endregion
  489. #region 转换为demical
  490. /// <summary>
  491. /// 将object转换为demical,若转换失败,则返回指定值。不抛出异常。
  492. /// </summary>
  493. /// <param name="str"></param>
  494. /// <returns></returns>
  495. public static decimal ParseToDecimal(this object str, decimal defaultValue)
  496. {
  497. try
  498. {
  499. return decimal.Parse(str.ToString());
  500. }
  501. catch
  502. {
  503. return defaultValue;
  504. }
  505. }
  506. /// <summary>
  507. /// 将object转换为demical,若转换失败,则返回0。不抛出异常。
  508. /// </summary>
  509. /// <param name="str"></param>
  510. /// <returns></returns>
  511. public static decimal ParseToDecimal(this object str)
  512. {
  513. try
  514. {
  515. return decimal.Parse(str.ToString());
  516. }
  517. catch
  518. {
  519. return 0;
  520. }
  521. }
  522. #endregion
  523. #region 转化为bool
  524. /// <summary>
  525. /// 将object转换为bool,若转换失败,则返回false。不抛出异常。
  526. /// </summary>
  527. /// <param name="str"></param>
  528. /// <returns></returns>
  529. public static bool ParseToBool(this object str)
  530. {
  531. try
  532. {
  533. return bool.Parse(str.ToString());
  534. }
  535. catch
  536. {
  537. return false;
  538. }
  539. }
  540. /// <summary>
  541. /// 将object转换为bool,若转换失败,则返回指定值。不抛出异常。
  542. /// </summary>
  543. /// <param name="str"></param>
  544. /// <returns></returns>
  545. public static bool ParseToBool(this object str, bool result)
  546. {
  547. try
  548. {
  549. return bool.Parse(str.ToString());
  550. }
  551. catch
  552. {
  553. return result;
  554. }
  555. }
  556. #endregion
  557. #region 转换为float
  558. /// <summary>
  559. /// 将object转换为float,若转换失败,则返回0。不抛出异常。
  560. /// </summary>
  561. /// <param name="str"></param>
  562. /// <returns></returns>
  563. public static float ParseToFloat(this object str)
  564. {
  565. try
  566. {
  567. return float.Parse(str.ToString());
  568. }
  569. catch
  570. {
  571. return 0;
  572. }
  573. }
  574. /// <summary>
  575. /// 将object转换为float,若转换失败,则返回指定值。不抛出异常。
  576. /// </summary>
  577. /// <param name="str"></param>
  578. /// <returns></returns>
  579. public static float ParseToFloat(this object str, float result)
  580. {
  581. try
  582. {
  583. return float.Parse(str.ToString());
  584. }
  585. catch
  586. {
  587. return result;
  588. }
  589. }
  590. #endregion
  591. #region 转换为Guid
  592. /// <summary>
  593. /// 将string转换为Guid,若转换失败,则返回Guid.Empty。不抛出异常。
  594. /// </summary>
  595. /// <param name="str"></param>
  596. /// <returns></returns>
  597. public static Guid ParseToGuid(this string str)
  598. {
  599. try
  600. {
  601. return new Guid(str);
  602. }
  603. catch
  604. {
  605. return Guid.Empty;
  606. }
  607. }
  608. #endregion
  609. #region 转换为DateTime
  610. /// <summary>
  611. /// 将string转换为DateTime,若转换失败,则返回日期最小值。不抛出异常。
  612. /// </summary>
  613. /// <param name="str"></param>
  614. /// <returns></returns>
  615. public static DateTime ParseToDateTime(this string str)
  616. {
  617. try
  618. {
  619. if (string.IsNullOrWhiteSpace(str))
  620. {
  621. return DateTime.MinValue;
  622. }
  623. if (str.Contains("-") || str.Contains("/"))
  624. {
  625. return DateTime.Parse(str);
  626. }
  627. else
  628. {
  629. int length = str.Length;
  630. switch (length)
  631. {
  632. case 4:
  633. return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
  634. case 6:
  635. return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
  636. case 8:
  637. return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
  638. case 10:
  639. return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
  640. case 12:
  641. return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
  642. case 14:
  643. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  644. default:
  645. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  646. }
  647. }
  648. }
  649. catch
  650. {
  651. return DateTime.MinValue;
  652. }
  653. }
  654. /// <summary>
  655. /// 将string转换为DateTime,若转换失败,则返回默认值。
  656. /// </summary>
  657. /// <param name="str"></param>
  658. /// <param name="defaultValue"></param>
  659. /// <returns></returns>
  660. public static DateTime ParseToDateTime(this string str, DateTime? defaultValue)
  661. {
  662. try
  663. {
  664. if (string.IsNullOrWhiteSpace(str))
  665. {
  666. return defaultValue.GetValueOrDefault();
  667. }
  668. if (str.Contains("-") || str.Contains("/"))
  669. {
  670. return DateTime.Parse(str);
  671. }
  672. else
  673. {
  674. int length = str.Length;
  675. switch (length)
  676. {
  677. case 4:
  678. return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
  679. case 6:
  680. return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
  681. case 8:
  682. return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
  683. case 10:
  684. return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
  685. case 12:
  686. return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
  687. case 14:
  688. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  689. default:
  690. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  691. }
  692. }
  693. }
  694. catch
  695. {
  696. return defaultValue.GetValueOrDefault();
  697. }
  698. }
  699. #endregion
  700. #region 转换为string
  701. /// <summary>
  702. /// 将object转换为string,若转换失败,则返回""。不抛出异常。
  703. /// </summary>
  704. /// <param name="str"></param>
  705. /// <returns></returns>
  706. public static string ParseToString(this object obj)
  707. {
  708. try
  709. {
  710. if (obj == null)
  711. {
  712. return string.Empty;
  713. }
  714. else
  715. {
  716. return obj.ToString();
  717. }
  718. }
  719. catch
  720. {
  721. return string.Empty;
  722. }
  723. }
  724. public static string ParseToStrings<T>(this object obj)
  725. {
  726. try
  727. {
  728. var list = obj as IEnumerable<T>;
  729. if (list != null)
  730. {
  731. return string.Join(",", list);
  732. }
  733. else
  734. {
  735. return obj.ToString();
  736. }
  737. }
  738. catch
  739. {
  740. return string.Empty;
  741. }
  742. }
  743. #endregion
  744. #region 转换为double
  745. /// <summary>
  746. /// 将object转换为double,若转换失败,则返回0。不抛出异常。
  747. /// </summary>
  748. /// <param name="obj"></param>
  749. /// <returns></returns>
  750. public static double ParseToDouble(this object obj)
  751. {
  752. try
  753. {
  754. return double.Parse(obj.ToString());
  755. }
  756. catch
  757. {
  758. return 0;
  759. }
  760. }
  761. /// <summary>
  762. /// 将object转换为double,若转换失败,则返回指定值。不抛出异常。
  763. /// </summary>
  764. /// <param name="str"></param>
  765. /// <param name="defaultValue"></param>
  766. /// <returns></returns>
  767. public static double ParseToDouble(this object str, double defaultValue)
  768. {
  769. try
  770. {
  771. return double.Parse(str.ToString());
  772. }
  773. catch
  774. {
  775. return defaultValue;
  776. }
  777. }
  778. #endregion
  779. #region 强制转换类型
  780. /// <summary>
  781. /// 强制转换类型
  782. /// </summary>
  783. /// <typeparam name="TResult"></typeparam>
  784. /// <param name="source"></param>
  785. /// <returns></returns>
  786. public static IEnumerable<TResult> CastSuper<TResult>(this IEnumerable source)
  787. {
  788. foreach (object item in source)
  789. {
  790. yield return (TResult)Convert.ChangeType(item, typeof(TResult));
  791. }
  792. }
  793. #endregion
  794. }
  795. }