DapperSQLExtensions.cs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987
  1. using Dapper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Collections;
  11. using DapperORMCore.Dapper.BaseModel;
  12. using DapperORMCore.Model.CoreModel;
  13. using DapperORMCore.String.Enums;
  14. using DapperORMCore.Model.BaseModel;
  15. using DapperORMCore.String.Consts;
  16. namespace DapperORMCore.Dapper
  17. {
  18. #region 扩展Dapper操作
  19. /// <summary>
  20. /// 获取对应操作语句
  21. /// </summary>
  22. public static class DapperSQLExtensions
  23. {
  24. #region add
  25. /// <summary>
  26. /// 插入 返回字段限定
  27. /// </summary>
  28. /// <typeparam name="T"></typeparam>
  29. /// <param name="con"></param>
  30. /// <param name="item"></param>
  31. /// <param name="filterNames"></param>
  32. /// <param name="outFieldName"></param>
  33. /// <param name="transaction"></param>
  34. /// <returns></returns>
  35. public static string InsertOutParm<T>(this IDbConnection con, T item, IEnumerable<string> filterNames, string outFieldName, IDbTransaction transaction = null) where T : class
  36. {
  37. var outSql = DynamicQuery.GetInsertQuery(typeof(T).Name, item, outFieldName, filterNames);
  38. return outSql;
  39. }
  40. /// <summary>
  41. /// 插入数据模型
  42. /// </summary>
  43. /// <typeparam name="T"></typeparam>
  44. /// <param name="con"></param>
  45. /// <param name="item"></param>
  46. /// <param name="filters"></param>
  47. /// <param name="transaction"></param>
  48. /// <returns></returns>
  49. public static string Insert<T>(this IDbConnection con, T item, string[] nofilters, IDbTransaction transaction = null) where T : class
  50. {
  51. var outSql = DynamicQuery.GetInsertQuery(typeof(T).Name, item, "", nofilters);
  52. return outSql;
  53. }
  54. /// <summary>
  55. /// 插入数据模型(不支持DataTable)
  56. /// </summary>
  57. /// <param name="con"></param>
  58. /// <param name="item"></param>
  59. /// <param name="tableName"></param>
  60. /// <param name="nofilters"></param>
  61. /// <param name="transaction"></param>
  62. /// <returns></returns>
  63. public static string Insert(this IDbConnection con, object item, string tableName, string[] nofilters, IDbTransaction transaction = null)
  64. {
  65. var outSql = DynamicQuery.GetInsertQuery(tableName, item, "", nofilters);
  66. return outSql;
  67. }
  68. #endregion
  69. #region delete
  70. /// <summary>
  71. /// 删除数据模型
  72. /// </summary>
  73. /// <typeparam name="T"></typeparam>
  74. /// <param name="con"></param>
  75. /// <param name="item"></param>
  76. /// <param name="transaction"></param>
  77. /// <returns></returns>
  78. public static string Delete<T>(this IDbConnection con, T item, string identityFieldName, IDbTransaction transaction = null) where T : class
  79. {
  80. //TODO以后这里还要优化,这里只支持一个字段主键
  81. var props = typeof(T).GetProperties();
  82. var columns = props.Select(p => p.Name).Where(s => s == identityFieldName).ToArray();
  83. var columnsValue = props.Where(s => s.Name == identityFieldName).
  84. Select(p => p.GetValue(item, null).ToString()).FirstOrDefault();
  85. var parameters = columns.Select(name => "and " + name + SQLBaseString._TO + "'" + columnsValue + "'").ToList();
  86. var outSql = string.Join(SQLBaseString._AND, parameters);
  87. outSql = string.Format(SQLString._DeleteBase, typeof(T).Name, outSql);
  88. //var result = con.Query<T>(sql, item, transaction);
  89. return outSql;
  90. }
  91. /// <summary>
  92. /// 删除单一条件SQL记录
  93. /// </summary>
  94. /// <param name="con"></param>
  95. /// <param name="tableName"></param>
  96. /// <param name="whereParm"></param>
  97. /// <param name="transaction"></param>
  98. /// <returns></returns>
  99. public static string Delete<T>(this IDbConnection con, string fieldName, string value, IDbTransaction transaction = null) where T : class
  100. {
  101. var whereParm = string.Format(SQLBaseString._FIELD_VALUE, fieldName, value);
  102. var outSql = DynamicQuery.GetDeleteQuery(typeof(T).Name, whereParm);
  103. //con.Query(sql, transaction);
  104. return outSql;
  105. }
  106. /// <summary>
  107. /// 删除多个条件SQL记录
  108. /// </summary>
  109. /// <param name="con"></param>
  110. /// <param name="tableName"></param>
  111. /// <param name="whereParm"></param>
  112. /// <param name="transaction"></param>
  113. /// <returns></returns>
  114. public static string Delete<T>(this IDbConnection con, IEnumerable<FieldKeyInfo> fieldKeyList, IDbTransaction transaction = null) where T : class
  115. {
  116. var whereParm = DynamicQuery.GetWhereSQL(fieldKeyList);
  117. var outSql = DynamicQuery.GetDeleteQuery(typeof(T).Name, whereParm);
  118. return outSql;
  119. }
  120. /// <summary>
  121. /// 删除多个条件SQL记录
  122. /// </summary>
  123. /// <param name="con"></param>
  124. /// <param name="tableName"></param>
  125. /// <param name="whereParm"></param>
  126. /// <param name="transaction"></param>
  127. /// <returns></returns>
  128. public static string Delete<T>(this IDbConnection con, string tableName, string fieldName, string value, IDbTransaction transaction = null) where T : class
  129. {
  130. var outSql = string.Format(SQLString._DeleteBase, tableName, string.Format("and {0}='1'", fieldName, value));
  131. return outSql;
  132. }
  133. /// <summary>
  134. /// 删除表
  135. /// </summary>
  136. /// <typeparam name="T"></typeparam>
  137. /// <param name="con"></param>
  138. /// <param name="item"></param>
  139. /// <param name="transaction"></param>
  140. /// <returns></returns>
  141. public static string DropTable<T>(this IDbConnection con, T item, IDbTransaction transaction = null) where T : class
  142. {
  143. var outSql = DynamicQuery.GetDropTableQuery(typeof(T).GetType().Name);
  144. return outSql;
  145. }
  146. #endregion
  147. #region update
  148. /// <summary>
  149. /// 更新模型数据
  150. /// </summary>
  151. /// <typeparam name="T"></typeparam>
  152. /// <param name="con"></param>
  153. /// <param name="item"></param>
  154. /// <param name="transaction"></param>
  155. public static string Update<T>(this IDbConnection con, T item, string identityFieldName, string noUpdateIdentityFieldName, IDbTransaction transaction = null) where T : class
  156. {
  157. var outSql = DynamicQuery.GetUpdateQuery(typeof(T).Name, item, identityFieldName, noUpdateIdentityFieldName);
  158. return outSql;
  159. }
  160. /// <summary>
  161. /// 更新模型数据Value
  162. /// </summary>
  163. /// <typeparam name="T"></typeparam>
  164. /// <param name="con"></param>
  165. /// <param name="item"></param>
  166. /// <param name="value"></param>
  167. /// <param name="identityFieldName"></param>
  168. /// <param name="noUpdateIdentityFieldName"></param>
  169. /// <param name="transaction"></param>
  170. /// <returns></returns>
  171. public static string Update<T>(this IDbConnection con, T item, string value, string identityFieldName, string noUpdateIdentityFieldName, IDbTransaction transaction = null) where T : class
  172. {
  173. var outSql = DynamicQuery.GetUpdateQuery(typeof(T).Name, item, value, identityFieldName, noUpdateIdentityFieldName);
  174. return outSql;
  175. }
  176. /// <summary>
  177. /// 更新模型数据Object
  178. /// </summary>
  179. /// <typeparam name="T"></typeparam>
  180. /// <param name="con"></param>
  181. /// <param name="item"></param>
  182. /// <param name="value"></param>
  183. /// <param name="identityFieldName"></param>
  184. /// <param name="noUpdateIdentityFieldName"></param>
  185. /// <param name="transaction"></param>
  186. /// <returns></returns>
  187. public static string Update(this IDbConnection con, object item, string value, string identityFieldName, string noUpdateIdentityFieldName,
  188. IDbTransaction transaction = null)
  189. {
  190. var outSql = DynamicQuery.GetUpdateQuery(item.GetType().Name, item, value, identityFieldName, noUpdateIdentityFieldName);
  191. return outSql;
  192. }
  193. /// <summary>
  194. /// 更新拼接语句
  195. /// </summary>
  196. /// <typeparam name="T"></typeparam>
  197. /// <param name="con"></param>
  198. /// <param name="item"></param>
  199. /// <param name="whereKeyList"></param>
  200. /// <param name="setKeyList"></param>
  201. /// <param name="transaction"></param>
  202. /// <returns></returns>
  203. public static string Update<T>(this IDbConnection con, IEnumerable<FieldKeyInfo> whereKeyList, IEnumerable<FieldKeyInfo> setKeyList, IDbTransaction transaction = null) where T : class
  204. {
  205. var tableName = typeof(T).Name;
  206. var whereInfo = string.Join(SQLBaseString._AND, whereKeyList.Select(m => m.FieldName + "='" + m.Value + "'"));
  207. var setInfo = string.Join(",", setKeyList.Select(m => m.FieldName + "='" + m.Value + "'"));
  208. var outSql = string.Format(SQLString._UpdateBase, tableName, setInfo, whereInfo);
  209. con.Execute(outSql, null, transaction);
  210. return outSql;
  211. }
  212. /// <summary>
  213. /// 更新模型数据SQL
  214. /// </summary>
  215. /// <typeparam name="T"></typeparam>
  216. /// <param name="con"></param>
  217. /// <param name="sql"></param>
  218. /// <param name="transaction"></param>
  219. /// <returns></returns>
  220. public static string Update<T>(this IDbConnection con, string sql, IDbTransaction transaction = null)
  221. {
  222. return sql;
  223. }
  224. #endregion
  225. #region exceute sql
  226. /// <summary>
  227. /// 执行SQL
  228. /// </summary>
  229. /// <typeparam name="T"></typeparam>
  230. /// <param name="con"></param>
  231. /// <param name="sql"></param>
  232. /// <param name="transaction"></param>
  233. /// <returns></returns>
  234. public static string ExceuteSQL<T>(this IDbConnection con, string sql, IDbTransaction transaction = null)
  235. {
  236. return sql;
  237. }
  238. #endregion
  239. #region sql bulk copy
  240. /// <summary>
  241. /// SQLBulkCopy批量插入数据
  242. /// </summary>
  243. /// <typeparam name="T"></typeparam>
  244. /// <param name="con"></param>
  245. /// <param name="list"></param>
  246. /// <param name="tableName"></param>
  247. public static DataQueueStatementInfo InsertBatchCopy<T>(this IDbConnection con, IEnumerable<T> list, string tableName
  248. ) where T : class
  249. {
  250. //var outSql = tableName;
  251. //if (list.Any())
  252. //{
  253. // Type type = typeof(T);
  254. // var result = list.ToList().GetConvertDataTableMapper<T>();
  255. // if (result.Status == OperateStatus.success.ToString())
  256. // {
  257. // using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con as SqlConnection))
  258. // {
  259. // con.Open();
  260. // bulkCopy.DestinationTableName = tableName;
  261. // bulkCopy.BatchSize = list.Count();
  262. // if (result != null && result.Data.Rows.Count != 0)
  263. // {
  264. // bulkCopy.WriteToServer(result.Data);
  265. // }
  266. // bulkCopy.Close();
  267. // }
  268. // }
  269. // return new DataQueueStatementInfo
  270. // {
  271. // ModelsT = null,
  272. // DBOperationType = EnumDBOperationType.BulkCopy,
  273. // SQL = sql
  274. // };
  275. //}
  276. //TODO 批量处理有问题
  277. return null;
  278. }
  279. /// <summary>
  280. /// SQLBulkCopy批量插入数据DataTable
  281. /// </summary>
  282. /// <typeparam name="T"></typeparam>
  283. /// <param name="con"></param>
  284. /// <param name="list"></param>
  285. /// <param name="tableName"></param>
  286. public static DataQueueStatementInfo InsertBatchCopyDataTable(this IDbConnection con, DataTable item, string tableName)
  287. {
  288. //var outSql = tableName;
  289. //if (item.Rows.Count>0)
  290. //{
  291. // using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con as SqlConnection))
  292. // {
  293. // con.Open();
  294. // bulkCopy.DestinationTableName = tableName;
  295. // bulkCopy.BatchSize = item.Rows.Count;
  296. // bulkCopy.WriteToServer(item);
  297. // bulkCopy.Close();
  298. // }
  299. // return new DataQueueStatementInfo
  300. // {
  301. // ModelsT = null,
  302. // DBOperationType = EnumDBOperationType.BulkCopy,
  303. // SQL = sql
  304. // };
  305. //}
  306. //TODO 批量处理有问题
  307. return null;
  308. }
  309. #endregion
  310. #region query
  311. /// <summary>
  312. /// 查询语句模型数据
  313. /// </summary>
  314. /// <typeparam name="T"></typeparam>
  315. /// <param name="con"></param>
  316. /// <param name="sql"></param>
  317. /// <returns></returns>
  318. public static string SelectSQL<T>(this IDbConnection con, string sql)
  319. {
  320. return sql;
  321. }
  322. /// <summary>
  323. /// 查询语句模型表数据
  324. /// </summary>
  325. /// <typeparam name="T"></typeparam>
  326. /// <param name="con"></param>
  327. /// <param name="tableName"></param>
  328. /// <returns></returns>
  329. public static string SelectTable<T>(this IDbConnection con, string sql)
  330. {
  331. var table = new DataTable("TableTemp");
  332. var reader = con.ExecuteReader(sql);
  333. table.Load(reader);
  334. return sql;
  335. }
  336. /// <summary>
  337. /// 查询语句模型表数据
  338. /// </summary>
  339. /// <typeparam name="T"></typeparam>
  340. /// <param name="con"></param>
  341. /// <param name="tableName"></param>
  342. /// <param name="where"></param>
  343. /// <param name="orderNames"></param>
  344. /// <returns></returns>
  345. public static string SelectTable<T>(this IDbConnection con, string tableName, string where)
  346. {
  347. var outSql = string.Format(SQLString._SelectSQLA, tableName, where);
  348. var table = new DataTable("TableTemp");
  349. var reader = con.ExecuteReader(outSql);
  350. table.Load(reader);
  351. return outSql;
  352. }
  353. /// <summary>
  354. /// 查询语句模型表数据
  355. /// </summary>
  356. /// <typeparam name="T"></typeparam>
  357. /// <param name="con"></param>
  358. /// <param name="tableName"></param>
  359. /// <param name="where"></param>
  360. /// <param name="orderNames"></param>
  361. /// <returns></returns>
  362. public static string SelectTable<T>(this IDbConnection con, string tableName, string where, string orderNames, bool isOrderDesc = false)
  363. {
  364. var outSql = string.Empty;
  365. if (isOrderDesc)
  366. {
  367. outSql = string.Format(SQLString._SelectSqlOrderByDesc, tableName, where == null ? "" : where, orderNames == null ? "" : orderNames);
  368. }
  369. else
  370. {
  371. outSql = string.Format(SQLString._SelectSqlOrderByDesc, tableName, where == null ? "" : where, orderNames == null ? "" : orderNames);
  372. }
  373. var table = new DataTable("TableTemp");
  374. var reader = con.ExecuteReader(outSql);
  375. table.Load(reader);
  376. return outSql;
  377. }
  378. /// <summary>
  379. /// 查询模型数据排序(带限定T)
  380. /// </summary>
  381. /// <typeparam name="T"></typeparam>
  382. /// <param name="con"></param>
  383. /// <param name="fieldKeyList">带限定T</param>
  384. /// <param name="sql"></param>
  385. /// <returns></returns>
  386. public static string SelectT<T>(this IDbConnection con, IEnumerable<FieldKeyInfo<T>> fieldKeyList, string sql = "") where T : class
  387. {
  388. fieldKeyList.ToList().ForEach(m =>
  389. {
  390. m.Value = m.FieldName + m.Operation + "'" + m.Value + "'";
  391. });
  392. var inSql = string.Empty;
  393. var fieldString = string.Join(SQLBaseString._AND, fieldKeyList.ToList().Select(m => m.Value).ToArray());
  394. if (string.IsNullOrWhiteSpace(sql))
  395. {
  396. inSql = string.Format(SQLString._SelectSQL, typeof(T).Name, fieldString);
  397. }
  398. else
  399. {
  400. inSql = string.Format(SQLString._SelectSQL,
  401. string.Format(SQLBaseString._INCLUDE_TEMP_VIEW, sql), fieldString);
  402. }
  403. return inSql;
  404. }
  405. /// <summary>
  406. /// 查询模型数据排序(不带限定T)
  407. /// </summary>
  408. /// <typeparam name="T"></typeparam>
  409. /// <param name="con"></param>
  410. /// <param name="fieldKeyList">不带限定T</param>
  411. /// <param name="sql"></param>
  412. /// <returns></returns>
  413. public static string Select<T>(this IDbConnection con, IEnumerable<FieldKeyInfo> fieldKeyList,
  414. string sql = "") where T : class
  415. {
  416. var inSql = string.Empty;
  417. var fieldString = DynamicQuery.GetWhereSQL(fieldKeyList);
  418. if (fieldKeyList.Count() != 0)
  419. {
  420. if (string.IsNullOrWhiteSpace(sql))
  421. {
  422. inSql = string.Format(SQLString._SelectSQL, typeof(T).Name, fieldString);
  423. }
  424. else
  425. {
  426. inSql = string.Format(SQLString._SelectSQL,
  427. string.Format(SQLBaseString._INCLUDE_TEMP_VIEW, sql), fieldString);
  428. }
  429. }
  430. else
  431. {
  432. if (string.IsNullOrWhiteSpace(sql))
  433. {
  434. inSql = string.Format(SQLString._Select, typeof(T).Name);
  435. }
  436. else
  437. {
  438. inSql = string.Format(SQLString._SelectSQLA,
  439. string.Format(SQLBaseString._INCLUDE_TEMP_VIEW, sql), fieldString);
  440. }
  441. }
  442. return inSql;
  443. }
  444. /// <summary>
  445. /// 查询模型数据
  446. /// </summary>
  447. /// <typeparam name="T"></typeparam>
  448. /// <param name="con"></param>
  449. /// <param name="criteria"></param>
  450. /// <returns></returns>
  451. public static string Select<T>(this IDbConnection con, object criteria = null)
  452. {
  453. var properties = PropertyManage.ParseProperties(criteria);
  454. var outSqlPairs = PropertyManage.GetSqlPairs(properties.AllNames, SQLBaseString._AND);
  455. var outSql = string.Format(SQLString._SelectSQLA, typeof(T).Name, outSqlPairs);
  456. return outSql;
  457. }
  458. /// <summary>
  459. /// 查询模型数据排序
  460. /// </summary>
  461. /// <typeparam name="T"></typeparam>
  462. /// <param name="con"></param>
  463. /// <param name="orderName"></param>
  464. /// <param name="sleepOrder"></param>
  465. /// <returns></returns>
  466. public static string SelectOrder<T>(this IDbConnection con, string orderName, bool sleepOrder = false)
  467. {
  468. var outSql = string.Format(SQLString._SelectBaseOrderBy, typeof(T).Name, orderName);
  469. if (sleepOrder)
  470. {
  471. outSql = outSql + SQLBaseString._DESC;
  472. }
  473. return outSql;
  474. }
  475. /// <summary>
  476. /// 查询模型数据第一条(有条件)
  477. /// </summary>
  478. /// <typeparam name="T"></typeparam>
  479. /// <param name="con"></param>
  480. /// <param name="fieldKeyList"></param>
  481. /// <param name="sql"></param>
  482. /// <returns></returns>
  483. public static string SelectOrderFirst<T>(this IDbConnection con, IEnumerable<FieldKeyInfo<T>> fieldKeyList, string sql = "") where T : class
  484. {
  485. fieldKeyList.ToList().ForEach(m =>
  486. {
  487. m.Value = m.FieldName + "='" + m.Value;
  488. });
  489. var outSql = string.Empty;
  490. var fieldString = string.Join(SQLBaseString._AND, fieldKeyList.ToList().Select(m => m.Value).ToArray());
  491. if (string.IsNullOrWhiteSpace(sql))
  492. {
  493. outSql = string.Format(SQLString._SelectBaseFirst, typeof(T).Name, fieldString);
  494. }
  495. else
  496. {
  497. outSql = string.Format(SQLString._SelectBaseFirst,
  498. string.Format(SQLBaseString._INCLUDE_TEMP_VIEW, sql), fieldString);
  499. }
  500. return outSql;
  501. }
  502. /// <summary>
  503. /// 查询模型数据第一条(无条件)
  504. /// </summary>
  505. /// <typeparam name="T"></typeparam>
  506. /// <param name="con"></param>
  507. /// <param name="orderName"></param>
  508. /// <param name="sleepOrder"></param>
  509. /// <returns></returns>
  510. public static string SelectOrderFirst<T>(this IDbConnection con, string orderName, bool sleepOrder = false)
  511. {
  512. var outSql = string.Format(SQLString._SelectBaseFirstOrderBy, typeof(T).Name, orderName);
  513. if (sleepOrder)
  514. {
  515. outSql = outSql + SQLBaseString._DESC;
  516. }
  517. return outSql;
  518. }
  519. /// <summary>
  520. /// 查询指定单一条件数据
  521. /// </summary>
  522. /// <typeparam name="T"></typeparam>
  523. /// <param name="con"></param>
  524. /// <param name="fieldName"></param>
  525. /// <param name="value"></param>
  526. /// <returns></returns>
  527. public static string SelectSQL<T>(this IDbConnection con, string fieldName, string value) where T : class
  528. {
  529. var outSql = string.Format(SQLString._SelectIdFirstSQLA, typeof(T).Name, fieldName, value);
  530. return outSql;
  531. }
  532. /// <summary>
  533. /// 分页查询
  534. /// </summary>
  535. /// <typeparam name="T"></typeparam>
  536. /// <param name="con"></param>
  537. /// <param name="fieldName"></param>
  538. /// <param name="value"></param>
  539. /// <returns></returns>
  540. public static string SelectPage<T>(this IDbConnection con, string sql, string orderByName, int pageSize, int pageIndex, bool sleepOrder = false) where T : class
  541. {
  542. var outSql = string.Format(SQLString._SelectPageBase, sql, orderByName, sleepOrder ? "DESC" : "", pageSize * (pageIndex - 1), pageSize);
  543. return outSql;
  544. }
  545. /// <summary>
  546. /// 分页查询
  547. /// </summary>
  548. /// <typeparam name="T"></typeparam>
  549. /// <param name="con"></param>
  550. /// <param name="fieldName"></param>
  551. /// <param name="value"></param>
  552. /// <returns></returns>
  553. public static string SelectPage<T>(this IDbConnection con, string orderByName, int pageSize, int pageIndex, string whereSQL = "", bool sleepOrder = false) where T : class
  554. {
  555. var sql = string.Format(SQLString._SelectSQLA, typeof(T).Name, whereSQL);
  556. var outSql = string.Format(SQLString._SelectPageBase, sql, orderByName, sleepOrder ? "DESC" : "", pageSize * (pageIndex - 1), pageSize);
  557. return outSql;
  558. }
  559. #endregion
  560. #region count
  561. /// <summary>
  562. /// 统计记录总数
  563. /// </summary>
  564. /// <typeparam name="T"></typeparam>
  565. /// <param name="con"></param>
  566. /// <param name="parms"></param>
  567. /// <returns></returns>
  568. public static string Count<T>(this IDbConnection con, string parms) where T : class
  569. {
  570. var outSql = string.Format(SQLString._CountBase, typeof(T).Name, parms);
  571. return outSql;
  572. }
  573. #endregion
  574. }
  575. #endregion
  576. #region Dynamic查询
  577. /// <summary>
  578. /// Dynamic查询
  579. /// </summary>
  580. public sealed class DynamicQuery
  581. {
  582. #region 获取插入语句结果DataTable
  583. /// <summary>
  584. /// 获取插入语句结果DataTable
  585. /// </summary>
  586. /// <param name="tableName"></param>
  587. /// <param name="item"></param>
  588. /// <param name="outFieldName"></param>
  589. /// <param name="filterNames"></param>
  590. /// <returns></returns>
  591. public static void GetInsertQuery(string tableName, DataTable item,
  592. string outFieldName,
  593. IEnumerable<string> filterNames)
  594. {
  595. for (int i = 0; i < item.Rows.Count; i++)
  596. {
  597. var fieldList = new List<string>();
  598. var valueList = new List<string>();
  599. }
  600. }
  601. #endregion
  602. #region 获取插入语句结果
  603. /// <summary>
  604. /// 获取插入语句结果
  605. /// </summary>
  606. /// <typeparam name="T"></typeparam>
  607. /// <param name="tableName"></param>
  608. /// <param name="item"></param>
  609. /// <param name="filterNames"></param>
  610. /// <param name="outFieldName"></param>
  611. /// <returns></returns>
  612. public static string GetInsertQuery(string tableName, object item,
  613. string outFieldName,
  614. IEnumerable<string> filterNames)
  615. {
  616. var props = item.GetType().GetProperties();
  617. var columns = props.Where(m => m.GetValue(item, null) != null).
  618. //去除时间类型中的默认值
  619. Where(m => m.GetValue(item, null).ToString() != DateTime.MinValue.ToString()
  620. //&& (m.GetValue(item, null).GetType() = Type.GetType("System.DateTime", true, true)
  621. ).Select(p => "[" + p.Name + "]").ToList();
  622. var values = new List<string>();
  623. if (filterNames != null)
  624. {
  625. foreach (var items in filterNames)
  626. {
  627. columns = columns.Where(s => s != "[" + items + "]").ToList();
  628. }
  629. foreach (PropertyInfo detail in props)
  630. {
  631. if (columns.Where(m => m.ToString() == "[" + detail.Name + "]").Any())
  632. {
  633. values.Add(item.GetType().GetProperty(detail.Name).GetValue(item, null).ToString());
  634. }
  635. }
  636. if (string.IsNullOrWhiteSpace(outFieldName))
  637. {
  638. return string.Format(SQLString._InsertBase,
  639. tableName,
  640. string.Join(",", columns),
  641. "'" + string.Join("','", values) + "'");
  642. }
  643. return string.Format(SQLString._InsertOutFirstFieldBase,
  644. tableName,
  645. string.Join(",", columns),
  646. "'" + string.Join("','", values) + "'",
  647. outFieldName);
  648. }
  649. else
  650. {
  651. foreach (PropertyInfo detail in props)
  652. {
  653. if (item.GetType().GetProperty(detail.Name).GetValue(item, null) != null)
  654. {
  655. values.Add(item.GetType().GetProperty(detail.Name).GetValue(item, null).ToString());
  656. }
  657. }
  658. if (string.IsNullOrWhiteSpace(outFieldName))
  659. {
  660. return string.Format(SQLString._InsertBase,
  661. tableName,
  662. string.Join(",", columns),
  663. "'" + string.Join("','", values) + "'");
  664. }
  665. return string.Format(SQLString._InsertOutFirstFieldBase,
  666. tableName,
  667. string.Join(",", columns),
  668. "'" + string.Join("','", values) + "'",
  669. outFieldName);
  670. }
  671. }
  672. #endregion
  673. #region 获取删除语句结果
  674. /// <summary>
  675. /// 获取删除语句结果
  676. /// </summary>
  677. /// <param name="tableName"></param>
  678. /// <param name="whereParm"></param>
  679. /// <returns></returns>
  680. public static string GetDeleteQuery(string tableName, string whereParm)
  681. {
  682. if (!string.IsNullOrWhiteSpace(tableName))
  683. {
  684. return string.Format(SQLString._DeleteBaseA,
  685. tableName, whereParm);
  686. }
  687. else
  688. {
  689. return string.Empty;
  690. }
  691. }
  692. #endregion
  693. #region 获取删除表语句结果
  694. /// <summary>
  695. /// 获取删除表语句结果
  696. /// </summary>
  697. /// <param name="tableName"></param>
  698. /// <returns></returns>
  699. public static string GetDropTableQuery(string tableName)
  700. {
  701. if (!string.IsNullOrWhiteSpace(tableName))
  702. {
  703. return string.Format(SQLString._DropBase,
  704. tableName);
  705. }
  706. else
  707. {
  708. return string.Empty;
  709. }
  710. }
  711. #endregion
  712. #region 获取更新语句结果
  713. /// <summary>
  714. /// 获取更新语句结果
  715. /// </summary>
  716. /// <typeparam name="T"></typeparam>
  717. /// <param name="tableName"></param>
  718. /// <param name="item"></param>
  719. /// <returns></returns>
  720. public static string GetUpdateQuery(string tableName, object item, string identityFieldName, string noUpdateIdentityFieldNames)
  721. {
  722. var props = item.GetType().GetProperties();
  723. var columns = props.Where(s => s.Name != identityFieldName &&
  724. !s.Name.Equals(identityFieldName) &&
  725. !s.Name.Equals(noUpdateIdentityFieldNames) && //TODO 这里只支持一个不更新字段名称,后期改
  726. s.GetValue(item, null) != null &&
  727. ((s.GetValue(item, null).ToString() != DateTime.MinValue.ToString() &&
  728. s.GetValue(item, null).GetType() == Type.GetType("System.DateTime", true, true))
  729. || s.GetValue(item, null).GetType() != Type.GetType("System.DateTime", true, true))
  730. ).ToArray();
  731. var parameters = columns.Select(s => "[" + s.Name + "]" + SQLBaseString._TO + "'" +
  732. s.GetValue(item, null) + "'").ToList();
  733. var whereParameter = props.Where(s => s.Name.ToLower() == identityFieldName.ToLower()).FirstOrDefault();
  734. return string.Format(SQLString._UpdateBase,
  735. tableName,
  736. string.Join(",", parameters),
  737. string.Format("[" + identityFieldName + "]" + "='" +
  738. whereParameter.GetValue(item, null)) + "'"
  739. );
  740. }
  741. public static string GetUpdateQuery(string tableName, object item, string identityFieldName)
  742. {
  743. var props = item.GetType().GetProperties();
  744. var columns = props.Where(s => s.Name != identityFieldName &&
  745. !s.Name.Equals(identityFieldName) && //TODO 这里只支持一个不更新字段名称,后期改
  746. s.GetValue(item, null) != null &&
  747. ((s.GetValue(item, null).ToString() != DateTime.MinValue.ToString() &&
  748. s.GetValue(item, null).GetType() == Type.GetType("System.DateTime", true, true))
  749. || s.GetValue(item, null).GetType() != Type.GetType("System.DateTime", true, true))
  750. ).ToArray();
  751. var parameters = columns.Select(s => "[" + s.Name + "]" + SQLBaseString._TO + "'" +
  752. s.GetValue(item, null) + "'").ToList();
  753. var whereParameter = props.Where(s => s.Name.ToLower() == identityFieldName.ToLower()).FirstOrDefault();
  754. return string.Format("UPDATE {0} SET {1} ",
  755. tableName,
  756. string.Join(",", parameters),
  757. string.Format("[" + identityFieldName + "]" + "='" +
  758. whereParameter.GetValue(item, null)) + "'"
  759. );
  760. }
  761. #endregion
  762. #region 获取更新语句结果Value
  763. /// <summary>
  764. /// 获取更新语句结果Value
  765. /// </summary>
  766. /// <typeparam name="T"></typeparam>
  767. /// <param name="tableName"></param>
  768. /// <param name="item"></param>
  769. /// <returns></returns>
  770. public static string GetUpdateQuery(string tableName, object item, string value, string identityFieldName, string noUpdateIdentityFieldNames)
  771. {
  772. var props = item.GetType().GetProperties();
  773. var columns = props.Where(s => s.Name != identityFieldName &&
  774. !s.Name.Equals(identityFieldName) &&
  775. !s.Name.Equals(noUpdateIdentityFieldNames) && //TODO 这里只支持一个不更新字段名称,后期改
  776. s.GetValue(item, null) != null &&
  777. (s.GetValue(item, null).ToString() != DateTime.MinValue.ToString() &&
  778. s.GetValue(item, null).GetType() != Type.GetType("System.DateTime", true, true))
  779. ).ToArray();
  780. var parameters = columns.Select(s => "[" + s.Name + "]" + SQLBaseString._TO + "'" +
  781. s.GetValue(item, null) + "'").ToList();
  782. return string.Format(SQLString._UpdateBase,
  783. tableName,
  784. string.Join(",", parameters),
  785. string.Format("[" + identityFieldName + "]" + "='" +
  786. value) + "'"
  787. );
  788. }
  789. #endregion
  790. #region 获取Where语句段
  791. /// <summary>
  792. /// 获取Where语句段
  793. /// </summary>
  794. /// <param name="fieldKeyList"></param>
  795. /// <returns></returns>
  796. public static string GetWhereSQL(IEnumerable<FieldKeyInfo> fieldKeyList)
  797. {
  798. if (fieldKeyList == null)
  799. {
  800. return "";
  801. }
  802. var paramList = new List<string>();
  803. fieldKeyList.Select(m => m.GroupIndex).Distinct().ToList().ForEach(index =>
  804. {
  805. var parmItem = new List<string>();
  806. fieldKeyList.Where(m => m.GroupIndex == index).ToList().ForEach(m =>
  807. {
  808. switch (m.FileType.Value)
  809. {
  810. case EnumCSharpPropertyType.BOOL:
  811. case EnumCSharpPropertyType.BOOLEAN:
  812. parmItem.Add(string.Format("{3} {0} {2} {1}", m.FieldName,
  813. Convert.ToInt32(m.Value), m.Operation, m.WhereItemType.ToString()));
  814. break;
  815. case EnumCSharpPropertyType.INT:
  816. case EnumCSharpPropertyType.INT16:
  817. case EnumCSharpPropertyType.INT32:
  818. case EnumCSharpPropertyType.DECIMAL:
  819. case EnumCSharpPropertyType.DOUBLE:
  820. case EnumCSharpPropertyType.FLOAT:
  821. parmItem.Add(string.Format("{2} {0} = {1}", m.FieldName, m.Value,
  822. m.WhereItemType.ToString()));
  823. break;
  824. case EnumCSharpPropertyType.BYTE:
  825. break;
  826. case EnumCSharpPropertyType.DATE:
  827. case EnumCSharpPropertyType.DATETIME:
  828. case EnumCSharpPropertyType.STRING:
  829. switch (m.Operation)
  830. {
  831. //包含和不包含有特殊意思在
  832. case DBOperationString._ContainIn:
  833. parmItem.Add(string.Format("{2} {1} {0}",
  834. string.Format(DBOperationString._ContainIn, m.Value), m.FieldName,
  835. m.WhereItemType.ToString()));
  836. break;
  837. case DBOperationString._NoContainIn:
  838. parmItem.Add(string.Format("{2} {1} {0}",
  839. string.Format(DBOperationString._NoContainIn, m.Value), m.FieldName,
  840. m.WhereItemType.ToString()));
  841. break;
  842. case DBOperationString._In:
  843. parmItem.Add(string.Format("{2} {1} {0}",
  844. string.Format(DBOperationString._In, m.Value), m.FieldName,
  845. m.WhereItemType.ToString()));
  846. break;
  847. case DBOperationString._NoEqual:
  848. parmItem.Add(string.Format("{2} {0} !='{1}'", m.FieldName, m.Value,
  849. m.WhereItemType.ToString()));
  850. break;
  851. default:
  852. parmItem.Add(string.Format("{2} {0} ='{1}'", m.FieldName, m.Value,
  853. m.WhereItemType.ToString()));
  854. break;
  855. }
  856. break;
  857. };
  858. });
  859. paramList.Add("(1=1 " + string.Join(" ", parmItem) + ")");
  860. });
  861. return string.Join(" AND ", paramList);
  862. }
  863. #endregion
  864. }
  865. #endregion
  866. #region private
  867. /// <summary>
  868. /// 动态工具
  869. /// </summary>
  870. public static class DynamicUtil
  871. {
  872. #region 转换扩展
  873. /// <summary>
  874. /// 转换模型
  875. /// </summary>
  876. /// <param name="operationStatusInfo"></param>
  877. /// <returns></returns>
  878. public static OperateResultInfo<DataTable> GetConvertDataTableMapper<T>(this T tModels)
  879. {
  880. var tList = new List<T>();
  881. tList.Add(tModels);
  882. return new OperateResultInfo<DataTable>
  883. {
  884. AffectedRows = 0,
  885. Data = ModelsToDataTable<T>(tList),
  886. Message = string.Empty,
  887. Status = OperateStatus.Success,
  888. };
  889. }
  890. /// <summary>
  891. /// 转换List模型
  892. /// </summary>
  893. /// <param name="operationStatusInfo"></param>
  894. /// <returns></returns>
  895. public static OperateResultInfo<DataTable> GetConvertDataTableMapper<T>(this List<T> tModels)
  896. {
  897. return new OperateResultInfo<DataTable>
  898. {
  899. AffectedRows = 0,
  900. Data = ModelsToDataTable<T>(tModels),
  901. Message = string.Empty,
  902. Status = OperateStatus.Success,
  903. };
  904. }
  905. /// <summary>
  906. /// 模型转换成Datatable
  907. /// </summary>
  908. /// <typeparam name="T"></typeparam>
  909. /// <param name="collection"></param>
  910. /// <returns></returns>
  911. public static DataTable ModelsToDataTable<T>(IEnumerable<T> collection)
  912. {
  913. var props = typeof(T).GetProperties();
  914. var dt = new DataTable();
  915. dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());
  916. if (collection.Count() > 0)
  917. {
  918. for (int i = 0; i < collection.Count(); i++)
  919. {
  920. ArrayList tempList = new ArrayList();
  921. foreach (PropertyInfo pi in props)
  922. {
  923. object obj = pi.GetValue(collection.ElementAt(i), null);
  924. tempList.Add(obj);
  925. }
  926. object[] array = tempList.ToArray();
  927. dt.LoadDataRow(array, true);
  928. }
  929. }
  930. return dt;
  931. }
  932. #endregion
  933. }
  934. #endregion
  935. }