QueryableExecuteSql.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Reflection;
  10. using System.Dynamic;
  11. using System.Threading.Tasks;
  12. using Newtonsoft.Json.Serialization;
  13. namespace SqlSugar
  14. {
  15. public partial class QueryableProvider<T> : QueryableAccessory, ISugarQueryable<T>
  16. {
  17. public virtual T Single()
  18. {
  19. if (QueryBuilder.OrderByValue.IsNullOrEmpty())
  20. {
  21. QueryBuilder.OrderByValue = QueryBuilder.DefaultOrderByTemplate;
  22. }
  23. var oldSkip = QueryBuilder.Skip;
  24. var oldTake = QueryBuilder.Take;
  25. var oldOrderBy = QueryBuilder.OrderByValue;
  26. QueryBuilder.Skip = null;
  27. QueryBuilder.Take = null;
  28. QueryBuilder.OrderByValue = null;
  29. var result = this.ToList();
  30. QueryBuilder.Skip = oldSkip;
  31. QueryBuilder.Take = oldTake;
  32. QueryBuilder.OrderByValue = oldOrderBy;
  33. if (result == null || result.Count == 0)
  34. {
  35. return default(T);
  36. }
  37. else if (result.Count >= 2)
  38. {
  39. Check.Exception(true, ErrorMessage.GetThrowMessage(".Single() result must not exceed one . You can use.First()", "使用single查询结果集不能大于1,适合主键查询,如果大于1你可以使用Queryable.First"));
  40. return default(T);
  41. }
  42. else
  43. {
  44. return result.SingleOrDefault();
  45. }
  46. }
  47. public virtual T Single(Expression<Func<T, bool>> expression)
  48. {
  49. _Where(expression);
  50. var result = Single();
  51. this.QueryBuilder.WhereInfos.Remove(this.QueryBuilder.WhereInfos.Last());
  52. return result;
  53. }
  54. public virtual T First()
  55. {
  56. if (QueryBuilder.OrderByValue.IsNullOrEmpty())
  57. {
  58. QueryBuilder.OrderByValue = QueryBuilder.DefaultOrderByTemplate;
  59. }
  60. if (QueryBuilder.Skip.HasValue)
  61. {
  62. QueryBuilder.Take = 1;
  63. return this.ToList().FirstOrDefault();
  64. }
  65. else
  66. {
  67. QueryBuilder.Skip = 0;
  68. QueryBuilder.Take = 1;
  69. var result = this.ToList();
  70. if (result.HasValue())
  71. return result.FirstOrDefault();
  72. else
  73. return default(T);
  74. }
  75. }
  76. public virtual T First(Expression<Func<T, bool>> expression)
  77. {
  78. _Where(expression);
  79. var result = First();
  80. this.QueryBuilder.WhereInfos.Remove(this.QueryBuilder.WhereInfos.Last());
  81. return result;
  82. }
  83. public virtual bool Any(Expression<Func<T, bool>> expression)
  84. {
  85. _Where(expression);
  86. var result = Any();
  87. this.QueryBuilder.WhereInfos.Remove(this.QueryBuilder.WhereInfos.Last());
  88. return result;
  89. }
  90. public virtual bool Any()
  91. {
  92. return this.Select("1").ToList().Count() > 0;
  93. }
  94. public virtual List<TResult> ToList<TResult>(Expression<Func<T, TResult>> expression)
  95. {
  96. if (this.QueryBuilder.Includes != null && this.QueryBuilder.Includes.Count > 0)
  97. {
  98. return NavSelectHelper.GetList(expression, this);
  99. // var list = this.ToList().Select(expression.Compile()).ToList();
  100. // return list;
  101. }
  102. else
  103. {
  104. var list = this.Select(expression).ToList();
  105. return list;
  106. }
  107. }
  108. public virtual int Count()
  109. {
  110. if (this.QueryBuilder.Skip == null &&
  111. this.QueryBuilder.Take == null &&
  112. this.QueryBuilder.OrderByValue == null &&
  113. this.QueryBuilder.PartitionByValue == null &&
  114. this.QueryBuilder.SelectValue == null &&
  115. this.QueryBuilder.Includes == null &&
  116. this.QueryBuilder.IsDistinct == false)
  117. {
  118. return this.Clone().Select<int>(" COUNT(1) ").ToList().FirstOrDefault();
  119. }
  120. MappingTableList expMapping;
  121. int result;
  122. _CountBegin(out expMapping, out result);
  123. if (IsCache)
  124. {
  125. var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
  126. result = CacheSchemeMain.GetOrCreate<int>(cacheService, this.QueryBuilder, () => { return GetCount(); }, CacheTime, this.Context, CacheKey);
  127. }
  128. else
  129. {
  130. result = GetCount();
  131. }
  132. _CountEnd(expMapping);
  133. return result;
  134. }
  135. public virtual int Count(Expression<Func<T, bool>> expression)
  136. {
  137. _Where(expression);
  138. var result = Count();
  139. this.QueryBuilder.WhereInfos.Remove(this.QueryBuilder.WhereInfos.Last());
  140. return result;
  141. }
  142. public virtual TResult Max<TResult>(string maxField)
  143. {
  144. this.Select(string.Format(QueryBuilder.MaxTemplate, maxField));
  145. var result = this._ToList<TResult>().SingleOrDefault();
  146. return result;
  147. }
  148. public virtual TResult Max<TResult>(Expression<Func<T, TResult>> expression)
  149. {
  150. return _Max<TResult>(expression);
  151. }
  152. public virtual TResult Min<TResult>(string minField)
  153. {
  154. this.Select(string.Format(QueryBuilder.MinTemplate, minField));
  155. var result = this._ToList<TResult>().SingleOrDefault();
  156. return result;
  157. }
  158. public virtual TResult Min<TResult>(Expression<Func<T, TResult>> expression)
  159. {
  160. return _Min<TResult>(expression);
  161. }
  162. public virtual TResult Sum<TResult>(string sumField)
  163. {
  164. this.Select(string.Format(QueryBuilder.SumTemplate, sumField));
  165. var result = this._ToList<TResult>().SingleOrDefault();
  166. return result;
  167. }
  168. public virtual TResult Sum<TResult>(Expression<Func<T, TResult>> expression)
  169. {
  170. return _Sum<TResult>(expression);
  171. }
  172. public virtual TResult Avg<TResult>(string avgField)
  173. {
  174. this.Select(string.Format(QueryBuilder.AvgTemplate, avgField));
  175. var result = this._ToList<TResult>().SingleOrDefault();
  176. return result;
  177. }
  178. public virtual TResult Avg<TResult>(Expression<Func<T, TResult>> expression)
  179. {
  180. return _Avg<TResult>(expression);
  181. }
  182. public virtual T[] ToArray()
  183. {
  184. var result = this.ToList();
  185. if (result.HasValue())
  186. return result.ToArray();
  187. else
  188. return null;
  189. }
  190. public virtual string ToJson()
  191. {
  192. if (IsCache)
  193. {
  194. var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
  195. var result = CacheSchemeMain.GetOrCreate<string>(cacheService, this.QueryBuilder, () =>
  196. {
  197. return this.Context.Utilities.SerializeObject(this.ToList(), typeof(T));
  198. }, CacheTime, this.Context, CacheKey);
  199. return result;
  200. }
  201. else
  202. {
  203. return this.Context.Utilities.SerializeObject(this.ToList(), typeof(T));
  204. }
  205. }
  206. public virtual string ToJsonPage(int pageIndex, int pageSize)
  207. {
  208. return this.Context.Utilities.SerializeObject(this.ToPageList(pageIndex, pageSize), typeof(T));
  209. }
  210. public virtual string ToJsonPage(int pageIndex, int pageSize, ref int totalNumber)
  211. {
  212. return this.Context.Utilities.SerializeObject(this.ToPageList(pageIndex, pageSize, ref totalNumber), typeof(T));
  213. }
  214. #region 内存行转列
  215. #region 同步
  216. public virtual DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  217. {
  218. return this.ToList().ToPivotTable(columnSelector, rowSelector, dataSelector);
  219. }
  220. public virtual List<dynamic> ToPivotList<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  221. {
  222. return ToPivotEnumerable(columnSelector, rowSelector, dataSelector).ToList();
  223. }
  224. public virtual IEnumerable<dynamic> ToPivotEnumerable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  225. {
  226. return this.ToList().ToPivotList(columnSelector, rowSelector, dataSelector);
  227. }
  228. public virtual string ToPivotJson<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  229. {
  230. var list = ToPivotEnumerable(columnSelector, rowSelector, dataSelector).ToList();
  231. return this.Context.Utilities.SerializeObject(list);
  232. }
  233. #endregion
  234. #region 异步
  235. public virtual async Task<DataTable> ToPivotTableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  236. {
  237. return (await this.ToListAsync()).ToPivotTable(columnSelector, rowSelector, dataSelector);
  238. }
  239. public virtual async Task<List<dynamic>> ToPivotListAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  240. {
  241. return (await ToPivotEnumerableAsync(columnSelector, rowSelector, dataSelector)).ToList();
  242. }
  243. public virtual async Task<IEnumerable<dynamic>> ToPivotEnumerableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  244. {
  245. return (await this.ToListAsync()).ToPivotList(columnSelector, rowSelector, dataSelector);
  246. }
  247. public virtual async Task<string> ToPivotJsonAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  248. {
  249. var list = (await ToPivotEnumerableAsync(columnSelector, rowSelector, dataSelector)).ToList();
  250. return this.Context.Utilities.SerializeObject(list);
  251. }
  252. #endregion
  253. #endregion
  254. public List<T> ToChildList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, bool isContainOneself = true)
  255. {
  256. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  257. var pk = GetTreeKey(entity);
  258. var list = this.ToList();
  259. return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself);
  260. }
  261. public List<T> ToChildList(Expression<Func<T, object>> parentIdExpression, object [] primaryKeyValues, bool isContainOneself = true)
  262. {
  263. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  264. var pk = GetTreeKey(entity);
  265. var list = this.ToList();
  266. List<T> result = new List<T>();
  267. foreach (var item in primaryKeyValues)
  268. {
  269. result.AddRange(GetChildList(parentIdExpression, pk, list, item, isContainOneself));
  270. }
  271. return result;
  272. }
  273. public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
  274. {
  275. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  276. var isTreeKey = entity.Columns.Any(it => it.IsTreeKey);
  277. if (isTreeKey)
  278. {
  279. return _ToParentListByTreeKey(parentIdExpression, primaryKeyValue);
  280. }
  281. List<T> result = new List<T>() { };
  282. Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key");
  283. var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name;
  284. var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
  285. var parentPropertyName = ParentInfo.DbColumnName;
  286. var tableName = this.QueryBuilder.GetTableNameString;
  287. if (this.QueryBuilder.IsSingle() == false)
  288. {
  289. if (this.QueryBuilder.JoinQueryInfos.Count > 0)
  290. {
  291. tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
  292. }
  293. if (this.QueryBuilder.EasyJoinInfos.Count > 0)
  294. {
  295. tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
  296. }
  297. }
  298. var current = this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).ClearFilter(this.QueryBuilder.RemoveFilters).InSingle(primaryKeyValue);
  299. if (current != null)
  300. {
  301. result.Add(current);
  302. object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
  303. int i = 0;
  304. while (parentId != null && this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).ClearFilter(this.QueryBuilder.RemoveFilters).In(parentId).Any())
  305. {
  306. Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0"));
  307. var parent = this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(parentId);
  308. result.Add(parent);
  309. parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
  310. ++i;
  311. }
  312. }
  313. return result;
  314. }
  315. public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, Expression<Func<T, bool>> parentWhereExpression)
  316. {
  317. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  318. var isTreeKey = entity.Columns.Any(it => it.IsTreeKey);
  319. if (isTreeKey)
  320. {
  321. return _ToParentListByTreeKey(parentIdExpression, primaryKeyValue,parentWhereExpression);
  322. }
  323. List<T> result = new List<T>() { };
  324. Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key");
  325. var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name;
  326. var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
  327. var parentPropertyName = ParentInfo.DbColumnName;
  328. var tableName = this.QueryBuilder.GetTableNameString;
  329. if (this.QueryBuilder.IsSingle() == false)
  330. {
  331. if (this.QueryBuilder.JoinQueryInfos.Count > 0)
  332. {
  333. tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
  334. }
  335. if (this.QueryBuilder.EasyJoinInfos.Count > 0)
  336. {
  337. tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
  338. }
  339. }
  340. var current = this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(primaryKeyValue);
  341. if (current != null)
  342. {
  343. result.Add(current);
  344. object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
  345. int i = 0;
  346. while (parentId != null && this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).Any())
  347. {
  348. Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0"));
  349. var parent = this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(parentId);
  350. result.Add(parent);
  351. parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
  352. ++i;
  353. }
  354. }
  355. return result;
  356. }
  357. public List<T> ToTree(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName)
  358. {
  359. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  360. var pk = primaryKeyPropertyName;
  361. var list = this.ToList();
  362. Expression<Func<T,IEnumerable<object> >> childListExpression = (Expression<Func<T, IEnumerable<object>>>)ExpressionBuilderHelper.CreateExpressionSelectField(typeof(T),childPropertyName,typeof(IEnumerable<object>));
  363. Expression<Func<T, object>> parentIdExpression = (Expression<Func<T, object>>)ExpressionBuilderHelper.CreateExpressionSelectFieldObject(typeof(T), parentIdPropertyName);
  364. return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue) ?? new List<T>();
  365. }
  366. public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, Expression<Func<T, object>> primaryKeyExpression)
  367. {
  368. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  369. var pk = ExpressionTool.GetMemberName(primaryKeyExpression);
  370. var list = this.ToList();
  371. return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue) ?? new List<T>();
  372. }
  373. public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue)
  374. {
  375. var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  376. var pk = GetTreeKey(entity);
  377. var list = this.ToList();
  378. return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue)??new List<T>();
  379. }
  380. public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, object[] childIds)
  381. {
  382. var list = this.ToList();
  383. return TreeAndFilterIds(childListExpression, parentIdExpression, rootValue, childIds, ref list) ?? new List<T>();
  384. }
  385. public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, object[] childIds, Expression<Func<T, object>> primaryKeyExpression)
  386. {
  387. var list = this.ToList();
  388. return TreeAndFilterIds(childListExpression, parentIdExpression,primaryKeyExpression, rootValue, childIds, ref list) ?? new List<T>();
  389. }
  390. public virtual DataTable ToDataTableByEntity()
  391. {
  392. var list = this.ToList();
  393. return this.Context.Utilities.ListToDataTable(list);
  394. }
  395. public virtual DataTable ToDataTable()
  396. {
  397. QueryBuilder.ResultType = typeof(SugarCacheDataTable);
  398. InitMapping();
  399. var sqlObj = this.ToSql();
  400. RestoreMapping();
  401. DataTable result = null;
  402. bool isChangeQueryableMasterSlave = GetIsMasterQuery();
  403. bool isChangeQueryableSlave = GetIsSlaveQuery();
  404. if (IsCache)
  405. {
  406. var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
  407. result = CacheSchemeMain.GetOrCreate<DataTable>(cacheService, this.QueryBuilder, () => { return this.Db.GetDataTable(sqlObj.Key, sqlObj.Value.ToArray()); }, CacheTime, this.Context, CacheKey);
  408. }
  409. else
  410. {
  411. result = this.Db.GetDataTable(sqlObj.Key, sqlObj.Value.ToArray());
  412. }
  413. RestChangeMasterQuery(isChangeQueryableMasterSlave);
  414. RestChangeSlaveQuery(isChangeQueryableSlave);
  415. return result;
  416. }
  417. public virtual DataTable ToDataTablePage(int pageIndex, int pageSize)
  418. {
  419. if (pageIndex == 0)
  420. pageIndex = 1;
  421. if (QueryBuilder.PartitionByValue.HasValue())
  422. {
  423. QueryBuilder.ExternalPageIndex = pageIndex;
  424. QueryBuilder.ExternalPageSize = pageSize;
  425. }
  426. else
  427. {
  428. QueryBuilder.Skip = (pageIndex - 1) * pageSize;
  429. QueryBuilder.Take = pageSize;
  430. }
  431. return ToDataTable();
  432. }
  433. public DataTable ToDataTableByEntityPage(int pageNumber, int pageSize, ref int totalNumber)
  434. {
  435. var list=this.ToPageList(pageNumber, pageSize,ref totalNumber);
  436. return this.Context.Utilities.ListToDataTable(list);
  437. }
  438. public virtual DataTable ToDataTablePage(int pageIndex, int pageSize, ref int totalNumber)
  439. {
  440. _RestoreMapping = false;
  441. totalNumber = this.Clone().Count();
  442. _RestoreMapping = true;
  443. var result = this.Clone().ToDataTablePage(pageIndex, pageSize);
  444. return result;
  445. }
  446. public virtual DataTable ToDataTablePage(int pageIndex, int pageSize, ref int totalNumber, ref int totalPage)
  447. {
  448. var result = ToDataTablePage(pageIndex, pageSize, ref totalNumber);
  449. totalPage = (totalNumber + pageSize - 1) / pageSize;
  450. return result;
  451. }
  452. public Dictionary<string, object> ToDictionary(Expression<Func<T, object>> key, Expression<Func<T, object>> value)
  453. {
  454. if (this.QueryBuilder.IsSingle() == false && (this.QueryBuilder.AsTables == null||this.QueryBuilder.AsTables.Count==0))
  455. {
  456. return this.MergeTable().ToDictionary(key,value);
  457. }
  458. this.QueryBuilder.ResultType = typeof(SugarCacheDictionary);
  459. var keyName = QueryBuilder.GetExpressionValue(key, ResolveExpressType.FieldSingle).GetResultString();
  460. var valueName = QueryBuilder.GetExpressionValue(value, ResolveExpressType.FieldSingle).GetResultString();
  461. if (this.QueryBuilder.IsSingle() == false)
  462. {
  463. keyName = this.QueryBuilder.TableShortName + "." + keyName;
  464. valueName = this.QueryBuilder.TableShortName + "." + valueName;
  465. }
  466. var isJson=this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => it.IsJson && it.PropertyName == ExpressionTool.GetMemberName(value)).Any();
  467. if (isJson)
  468. {
  469. var result = this.Select<T>(keyName + "," + valueName).ToList().ToDictionary(ExpressionTool.GetMemberName(key), ExpressionTool.GetMemberName(value));
  470. return result;
  471. }
  472. else if (valueName == null)
  473. {
  474. // 编译key和value的表达式树为委托
  475. var keySelector = key.Compile();
  476. var valueSelector = value.Compile();
  477. Dictionary<object,object> objDic= this.ToList().ToDictionary(keySelector, valueSelector);
  478. return objDic.ToDictionary(it=>it.Key?.ToString(),it=>it.Value);
  479. }
  480. else
  481. {
  482. var result = this.Select<KeyValuePair<string, object>>(keyName + "," + valueName).ToList().ToDictionary(it => it.Key.ObjToString(), it => it.Value);
  483. return result;
  484. }
  485. }
  486. public List<Dictionary<string, object>> ToDictionaryList()
  487. {
  488. var list = this.ToList();
  489. if (list == null)
  490. return null;
  491. else
  492. return this.Context.Utilities.DeserializeObject<List<Dictionary<string, object>>>(this.Context.Utilities.SerializeObject(list));
  493. }
  494. public async Task<List<Dictionary<string, object>>> ToDictionaryListAsync()
  495. {
  496. var list = await this.ToListAsync();
  497. if (list == null)
  498. return null;
  499. else
  500. return this.Context.Utilities.DeserializeObject<List<Dictionary<string, object>>>(this.Context.Utilities.SerializeObject(list));
  501. }
  502. public virtual List<T> ToList()
  503. {
  504. InitMapping();
  505. return _ToList<T>();
  506. }
  507. public List<T> SetContext<ParameterT>(Expression<Func<T, bool>> whereExpression, ParameterT parameter)
  508. {
  509. var queryableContext = this.Context.TempItems["Queryable_To_Context"] as MapperContext<ParameterT>;
  510. var rootList = queryableContext.list;
  511. List<ISugarQueryable<object>> queryableList = new List<ISugarQueryable<object>>();
  512. var index = rootList.IndexOf(parameter);
  513. var selector = this.Clone().QueryBuilder.GetSelectValue+$",{index} as ";
  514. var sqlObj=this.Clone().Where(whereExpression).Select(selector+"")
  515. .Select(it => (object) new { it, sql_sugar_index = index });
  516. queryableList.Add(sqlObj);
  517. var allList = this.Context.Union(queryableList)
  518. .Select(it=>new { it=default(T), sql_sugar_index =0})
  519. .Select("*").ToList();
  520. var result = new List<T>();
  521. throw new Exception("开发中");
  522. }
  523. public List<T> SetContext<ParameterT>(Expression<Func<T, object>> thisFiled, Expression<Func<object>> mappingFiled, ParameterT parameter)
  524. {
  525. if (parameter == null)
  526. {
  527. return new List<T>();
  528. }
  529. List<T> result = new List<T>();
  530. var entity = this.Context.EntityMaintenance.GetEntityInfo<ParameterT>();
  531. var queryableContext = this.Context.TempItems["Queryable_To_Context"] as MapperContext<ParameterT>;
  532. var list = queryableContext.list;
  533. var pkName = "";
  534. if ((mappingFiled as LambdaExpression).Body is UnaryExpression)
  535. {
  536. pkName = (((mappingFiled as LambdaExpression).Body as UnaryExpression).Operand as MemberExpression).Member.Name;
  537. }
  538. else
  539. {
  540. pkName = ((mappingFiled as LambdaExpression).Body as MemberExpression).Member.Name;
  541. }
  542. var key = thisFiled.ToString() + mappingFiled.ToString() + typeof(ParameterT).FullName + typeof(T).FullName;
  543. var ids = list.Where(it => it != null).Select(it => it.GetType().GetProperty(pkName).GetValue(it)).Distinct().ToArray();
  544. if (queryableContext.TempChildLists == null)
  545. queryableContext.TempChildLists = new Dictionary<string, object>();
  546. if (list != null && queryableContext.TempChildLists.ContainsKey(key))
  547. {
  548. result = (List<T>)queryableContext.TempChildLists[key];
  549. }
  550. else
  551. {
  552. if (queryableContext.TempChildLists == null)
  553. queryableContext.TempChildLists = new Dictionary<string, object>();
  554. this.Context.Utilities.PageEach(ids, 200, pageIds =>
  555. {
  556. result.AddRange(this.Clone().In(thisFiled, pageIds).ToList());
  557. });
  558. queryableContext.TempChildLists[key] = result;
  559. }
  560. var name = "";
  561. if ((thisFiled as LambdaExpression).Body is UnaryExpression)
  562. {
  563. name = (((thisFiled as LambdaExpression).Body as UnaryExpression).Operand as MemberExpression).Member.Name;
  564. }
  565. else
  566. {
  567. name = ((thisFiled as LambdaExpression).Body as MemberExpression).Member.Name;
  568. }
  569. var pkValue = parameter.GetType().GetProperty(pkName).GetValue(parameter);
  570. result = result.Where(it => it.GetType().GetProperty(name).GetValue(it).ObjToString() == pkValue.ObjToString()).ToList();
  571. return result;
  572. }
  573. public List<T> SetContext<ParameterT>(Expression<Func<T, object>> thisFiled1, Expression<Func<object>> mappingFiled1,
  574. Expression<Func<T, object>> thisFiled2, Expression<Func<object>> mappingFiled2,
  575. ParameterT parameter)
  576. {
  577. if (parameter == null)
  578. {
  579. return new List<T>();
  580. }
  581. var rightEntity = this.Context.EntityMaintenance.GetEntityInfo<ParameterT>();
  582. var leftEntity = this.Context.EntityMaintenance.GetEntityInfo<T>();
  583. List<T> result = new List<T>();
  584. var queryableContext = this.Context.TempItems["Queryable_To_Context"] as MapperContext<ParameterT>;
  585. var list = queryableContext.list;
  586. var key = thisFiled1.ToString() + mappingFiled1.ToString() +
  587. thisFiled2.ToString() + mappingFiled2.ToString() +
  588. typeof(ParameterT).FullName + typeof(T).FullName;
  589. MappingFieldsHelper<ParameterT> fieldsHelper = new MappingFieldsHelper<ParameterT>();
  590. var mappings = new List<MappingFieldsExpression>() {
  591. new MappingFieldsExpression(){
  592. LeftColumnExpression=thisFiled1,
  593. LeftEntityColumn=leftEntity.Columns.First(it=>it.PropertyName==ExpressionTool.GetMemberName(thisFiled1)),
  594. RightColumnExpression=mappingFiled1,
  595. RightEntityColumn=rightEntity.Columns.First(it=>it.PropertyName==ExpressionTool.GetMemberName(mappingFiled1))
  596. },
  597. new MappingFieldsExpression(){
  598. LeftColumnExpression=thisFiled2,
  599. LeftEntityColumn=leftEntity.Columns.First(it=>it.PropertyName==ExpressionTool.GetMemberName(thisFiled2)),
  600. RightColumnExpression=mappingFiled2,
  601. RightEntityColumn=rightEntity.Columns.First(it=>it.PropertyName==ExpressionTool.GetMemberName(mappingFiled2))
  602. }
  603. };
  604. var conditionals = fieldsHelper.GetMppingSql(list.Cast<object>().ToList(), mappings);
  605. if (queryableContext.TempChildLists == null)
  606. queryableContext.TempChildLists = new Dictionary<string, object>();
  607. if (list != null && queryableContext.TempChildLists.ContainsKey(key))
  608. {
  609. result = (List<T>)queryableContext.TempChildLists[key];
  610. }
  611. else
  612. {
  613. result = this.Clone().Where(conditionals, true).ToList();
  614. queryableContext.TempChildLists[key] = result;
  615. }
  616. List<object> listObj = result.Select(it => (object)it).ToList();
  617. object obj = (object)parameter;
  618. var newResult = fieldsHelper.GetSetList(obj, listObj, mappings).Select(it => (T)it).ToList();
  619. return newResult;
  620. }
  621. public virtual void ForEach(Action<T> action, int singleMaxReads = 300, System.Threading.CancellationTokenSource cancellationTokenSource = null)
  622. {
  623. Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0, ErrorMessage.GetThrowMessage("no support Skip take, use PageForEach", "不支持Skip Take,请使用 Queryale.PageForEach"));
  624. var totalNumber = 0;
  625. var totalPage = 1;
  626. for (int i = 1; i <= totalPage; i++)
  627. {
  628. if (cancellationTokenSource?.IsCancellationRequested == true) return;
  629. var queryable = this.Clone();
  630. var page =
  631. totalPage == 1 ?
  632. queryable.ToPageList(i, singleMaxReads, ref totalNumber, ref totalPage) :
  633. queryable.ToPageList(i, singleMaxReads);
  634. foreach (var item in page)
  635. {
  636. if (cancellationTokenSource?.IsCancellationRequested == true) return;
  637. action.Invoke(item);
  638. }
  639. }
  640. }
  641. public virtual void ForEachByPage(Action<T> action, int pageIndex, int pageSize, ref int totalNumber, int singleMaxReads = 300, System.Threading.CancellationTokenSource cancellationTokenSource = null)
  642. {
  643. int count = this.Clone().Count();
  644. if (count > 0)
  645. {
  646. if (pageSize > singleMaxReads && count - ((pageIndex - 1) * pageSize) > singleMaxReads)
  647. {
  648. Int32 Skip = (pageIndex - 1) * pageSize;
  649. Int32 NowCount = count - Skip;
  650. Int32 number = 0;
  651. if (NowCount > pageSize) NowCount = pageSize;
  652. while (NowCount > 0)
  653. {
  654. if (cancellationTokenSource?.IsCancellationRequested == true) return;
  655. if (number + singleMaxReads > pageSize) singleMaxReads = NowCount;
  656. foreach (var item in this.Clone().Skip(Skip).Take(singleMaxReads).ToList())
  657. {
  658. if (cancellationTokenSource?.IsCancellationRequested == true) return;
  659. action.Invoke(item);
  660. }
  661. NowCount -= singleMaxReads;
  662. Skip += singleMaxReads;
  663. number += singleMaxReads;
  664. }
  665. }
  666. else
  667. {
  668. if (cancellationTokenSource?.IsCancellationRequested == true) return;
  669. foreach (var item in this.Clone().ToPageList(pageIndex, pageSize))
  670. {
  671. if (cancellationTokenSource?.IsCancellationRequested == true) return;
  672. action.Invoke(item);
  673. }
  674. }
  675. }
  676. totalNumber = count;
  677. }
  678. public List<T> ToOffsetPage(int pageIndex, int pageSize)
  679. {
  680. if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer)
  681. {
  682. this.QueryBuilder.Offset = "true";
  683. return this.ToPageList(pageIndex, pageSize);
  684. }
  685. else
  686. {
  687. _ToOffsetPage(pageIndex, pageSize);
  688. return this.ToList();
  689. }
  690. }
  691. public List<T> ToOffsetPage(int pageIndex, int pageSize, ref int totalNumber)
  692. {
  693. if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer)
  694. {
  695. this.QueryBuilder.Offset = "true";
  696. return this.ToPageList(pageIndex, pageSize, ref totalNumber);
  697. }
  698. else
  699. {
  700. totalNumber = this.Clone().Count();
  701. _ToOffsetPage(pageIndex, pageSize);
  702. return this.Clone().ToList();
  703. }
  704. }
  705. public Task<List<T>> ToOffsetPageAsync(int pageIndex, int pageSize)
  706. {
  707. if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer)
  708. {
  709. this.QueryBuilder.Offset = "true";
  710. return this.ToPageListAsync(pageIndex, pageSize);
  711. }
  712. else
  713. {
  714. _ToOffsetPage(pageIndex, pageSize);
  715. return this.ToListAsync();
  716. }
  717. }
  718. public virtual List<T> ToPageList(int pageIndex, int pageSize)
  719. {
  720. pageIndex = _PageList(pageIndex, pageSize);
  721. return ToList();
  722. }
  723. public virtual List<TResult> ToPageList<TResult>(int pageIndex, int pageSize, ref int totalNumber, Expression<Func<T, TResult>> expression)
  724. {
  725. if (this.QueryBuilder.Includes != null && this.QueryBuilder.Includes.Count > 0)
  726. {
  727. if (pageIndex == 0)
  728. pageIndex = 1;
  729. var list = this.Clone().Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(expression);
  730. var countQueryable = this.Clone();
  731. countQueryable.QueryBuilder.Includes = null;
  732. totalNumber = countQueryable.Count();
  733. return list;
  734. }
  735. else
  736. {
  737. var list = this.Select(expression).ToPageList(pageIndex, pageSize, ref totalNumber).ToList();
  738. return list;
  739. }
  740. }
  741. public virtual List<T> ToPageList(int pageIndex, int pageSize, ref int totalNumber)
  742. {
  743. var oldMapping = this.Context.MappingTables;
  744. var countQueryable = this.Clone();
  745. if (countQueryable.QueryBuilder.Offset == "true")
  746. {
  747. countQueryable.QueryBuilder.Offset = null;
  748. }
  749. totalNumber = countQueryable.Count();
  750. this.Context.MappingTables = oldMapping;
  751. return this.Clone().ToPageList(pageIndex, pageSize);
  752. }
  753. public virtual List<T> ToPageList(int pageIndex, int pageSize, ref int totalNumber, ref int totalPage)
  754. {
  755. var result = ToPageList(pageIndex, pageSize, ref totalNumber);
  756. totalPage = (totalNumber + pageSize - 1) / pageSize;
  757. return result;
  758. }
  759. public virtual string ToSqlString()
  760. {
  761. var sqlObj = this.Clone().ToSql();
  762. var result = sqlObj.Key;
  763. if (result == null) return null;
  764. result = UtilMethods.GetSqlString(this.Context.CurrentConnectionConfig, sqlObj);
  765. return result;
  766. }
  767. public virtual KeyValuePair<string, List<SugarParameter>> ToSql()
  768. {
  769. if (!QueryBuilder.IsClone)
  770. {
  771. var newQueryable = this.Clone();
  772. newQueryable.QueryBuilder.IsClone = true;
  773. return newQueryable.ToSql();
  774. }
  775. else
  776. {
  777. return _ToSql();
  778. }
  779. }
  780. public string ToClassString(string className)
  781. {
  782. List<DbColumnInfo> columns = new List<DbColumnInfo>();
  783. var properties = typeof(T).GetProperties();
  784. foreach (var item in properties)
  785. {
  786. columns.Add(new DbColumnInfo()
  787. {
  788. DbColumnName = item.Name,
  789. PropertyName = UtilMethods.GetUnderType(item.PropertyType).Name,
  790. PropertyType = UtilMethods.GetUnderType(item.PropertyType)
  791. });
  792. }
  793. var result = ((this.Context.DbFirst) as DbFirstProvider).GetClassString(columns, ref className);
  794. return result;
  795. }
  796. public int IntoTable<TableEntityType>()
  797. {
  798. return IntoTable(typeof(TableEntityType));
  799. }
  800. public int IntoTable<TableEntityType>(string TableName)
  801. {
  802. return IntoTable(typeof(TableEntityType), TableName);
  803. }
  804. public int IntoTable(Type TableEntityType)
  805. {
  806. var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(TableEntityType);
  807. var name = this.SqlBuilder.GetTranslationTableName(entityInfo.DbTableName);
  808. return IntoTable(TableEntityType, name);
  809. }
  810. public int IntoTable(Type TableEntityType,string TableName)
  811. {
  812. KeyValuePair<string, List<SugarParameter>> sqlInfo;
  813. string sql;
  814. OutIntoTableSql(TableName, out sqlInfo, out sql, TableEntityType);
  815. return this.Context.Ado.ExecuteCommand(sql, sqlInfo.Value);
  816. }
  817. }
  818. }